ruby語句塊和閉包
Block 不是物件,是Ruby的語言特性,近似於閉包(Closure)。
範例:
def meth
res= yield
"Block called returns #{res}"
end
puts meth do next “next_value” end #Block called returns next_value
puts meth do break “break_value” end # break_vcowcuo錯誤哦alue
def my
meth do return “reutnr_value” end
end
puts my () # return_value
紅色部分就是 Block.
block 之 next
block中的 next [value] 導致 block結束,並返回[value]給呼叫函式。
block 之 break
block中的 break [value] 導致 block結束,並導致呼叫block的函式也返回,返回值是[value]。
block 之 return
block中的 return [value] 導致 block結束,並導致定義block的函式返回,返回值是[value]。
Proc
Proc 是Ruby 對 block的面向物件的封裝。
範例:
def meth (&proc)
res= proc.call
"Proc called returns #{res}"
end
puts meth do next “next_value” end
puts eth do break “break_value” end # 出錯
def my
meth do return “reutnr_value” end
end
puts my () # return_value
紅色部分就是 Proc.
Proc 之 next
Proc中的 next [value] 導致 Proc結束,並返回[value]給呼叫函式。
block 之 break
Proc中不能使用break,這回導致異常。
block 之 return
Proc中的 return [value] 導致 Proc結束,並導致定義Proc
Lambda
Lambda 是Ruby 對 Proc進一步的封裝。
範例:
def meth (&proc)
res= proc.call
"Lambda called returns #{res}"
end
def my
meth (&lambda do return “reutnr_value” end)
end
puts my () # Lambda called returns return_value
紅色部分就是 Lambda.
Lambda 和 Proc的區別就在 Lambda中的 return 導致 lambda 函式結束,並返回呼叫lamdad的函式(Proc和Block都是從定義的它們的函式放回)
Block,Proc,Lambda的區別總結
- Block 中 用next從自身返回,用break從呼叫它的函式中返回, 用 returnc從定義它的函式中返回;
- Proc 是對Block的面向物件封裝,不支援breaky用法 ;
- lambda是對Proc的封裝, Lambda中return等同於next;