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"