[Ruby]Blocks, Procs and Lambdas
Published in
Jan 18, 2020
比較Ruby的Block, Proc, Lambda
Block
Block主要有兩種寫法 do...end
或是 {...}
,在 |
中的num是傳入block的變數,而根據不同的需求,也可以傳入多個變數
在上面的範例中,block其實是 each
這個method,將每個array中的item傳入block中,並將控制權轉交給block,block本身不是物件,是不能單獨存在的,只能作為 Ruby 指令或呼叫方法時的引數。
一般要怎麼執行Block呢?可以使用 yield
,下面的範例,當 my_name
這個method在執行到 yield(name)
這一行時,會暫時將控制權轉給block,並將name這個變數傳入block中。
Proc
最簡單理解Proc的方式,就是想成你把block存成一個變數,也就是將它物件化,讓code可以重複使用,如果要創建一個Proc,就用 Proc.new
,並且給它一組block就可以了。
要執行的時候, 只要執行這個物件上的 call
,同時也可以帶入參數。
Lamda
Lamda和Proc很相似,只有兩點不同
- 當傳入的參數,數量和定義的不同時,Proc不會回報error,Lamda會。
- 處理
return
時,當你在一個function裡,呼叫一個內含return的proc,因為是將控制權轉交給proc中的block,所以在執行到return時,function會立即return。而如果是lamda的話,則會回到function本身。
參考資料