Ruby系列:玩轉閉包(Block,Proc,lambda)

來源:互聯網
上載者:User

Block,lambda,Proc要好好理解下,在Ruby中很重要。

  • Block塊就是一個匿名函數,被調用的方法調用,在調用的方法裡面通過field調用。Block主要用於迭代。
Ruby代碼 :

 

arr = [1,2,3,4,5]
arr.each{|item| puts item}

Proc也是一個代碼塊,相當於過程吧
Ruby代碼 :
a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}
a_proc.call(9, 1, 2, 3)   #=> [9, 18, 27]
Proc.new建立一個Proc對象時,可以不帶一個block,只是在定義Proc的方法上帶一個block,這個block會變成屬於Proc的。

Ruby代碼 :

def proc_from
  Proc.new
end

 

proc = proc_from { "hello" }
proc.call   #=> "hello"

Proc對象是與局部變數綁定的一個代碼塊。綁定之後,代碼可以在不同的上下文中調用,並可以訪問局部變數。

 

Ruby代碼
def gen_times(factor)
  return Proc.new {|n| n*factor }
end

 

times3 = gen_times(3)
times5 = gen_times(5)

times3.call(12)               #=> 36
times5.call(5)                #=> 25
times3.call(times5.call(4))   #=> 60

lambda也是匿名函數

 

Ruby代碼
a_lambda = lambda {|a| puts a}
a_lambda.call("samsam")

 

 lambda返回的是一個Proc對象。

Ruby代碼

a_lambda.class #=>Proc

 lambda和Proc是一樣的,除了Proc的return會跳出調用的方法,lambda則不會,它只是返回自己。

Ruby代碼

 

def foo  
    f = Proc.new { return "return from foo from inside proc" }  
    f.call # control leaves foo here  
    return "return from foo"   
  end  
    
  def bar  
    f = lambda { return "return from lambda" }  
    puts f.call # control does not leave bar here  prints "return from lambda"
    return "return from bar"   
  end  
    
  puts foo # prints "return from foo from inside proc"   
  puts bar # prints "return from bar"  

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.