[Ruby]Blocks, Procs and Lambdas

Wendy Wu
W-Learning Note
Published in
Jan 18, 2020

比較Ruby的Block, Proc, Lambda

Block

Block主要有兩種寫法 do...end 或是 {...} ,在 | 中的num是傳入block的變數,而根據不同的需求,也可以傳入多個變數

block

在上面的範例中,block其實是 each 這個method,將每個array中的item傳入block中,並將控制權轉交給block,block本身不是物件,是不能單獨存在的,只能作為 Ruby 指令或呼叫方法時的引數。

一般要怎麼執行Block呢?可以使用 yield ,下面的範例,當 my_name 這個method在執行到 yield(name) 這一行時,會暫時將控制權轉給block,並將name這個變數傳入block中。

block_yield

Proc

最簡單理解Proc的方式,就是想成你把block存成一個變數,也就是將它物件化,讓code可以重複使用,如果要創建一個Proc,就用 Proc.new ,並且給它一組block就可以了。

要執行的時候, 只要執行這個物件上的 call ,同時也可以帶入參數。

Lamda

Lamda和Proc很相似,只有兩點不同

  • 當傳入的參數,數量和定義的不同時,Proc不會回報error,Lamda會。
lamda_1
  • 處理 return 時,當你在一個function裡,呼叫一個內含return的proc,因為是將控制權轉交給proc中的block,所以在執行到return時,function會立即return。而如果是lamda的話,則會回到function本身。
lamda_2

--

--