iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
Modern Web

Ruby on Rails面試題挑戰系列 第 11

Ruby on Rails面試題挑戰 Day11 - proc與lamba的差異是什麼?

What is the difference between a proc and a lambda?
proc與lamba的差異是什麼?


昨天我們提到了Ruby中少數不是物件的Block,Block無法指定給變數或單獨存在,但如果我們想要將Block轉化成物件的話,可以使用Proc類別!

Proc產生的物件是一個封裝的程式碼片段,它可以被指定給變數、傳給方法和被呼叫(call),舉下面的程式碼說明會更加清楚

#Block無法指定給變數
say_hello_world = {puts "hello world"} #=> 會噴錯

say_hello_world = Proc.new { puts "hello world" }

say_hello_world.call #=>hello world

使用Proc類別new出一個proc物件將後面的Block物件化,可以將他指定給變數,要使用的時候可以用call方法呼叫。

Proc也可以帶參數,像下面這種寫法

say_my_name = Proc.new { |name| puts name }

say_my_name.call("John") # => John

另外一種跟產生Proc的方式是用lambda方法,使用方式幾乎一模一樣!

lambda1 = lambda { |x| x**2 }

puts lambda1.call(3) # => 9

那到底用Proc產生的物件跟用lambda產生的物件差異在哪裡?
主要有以下兩個差異點

  1. 對參數的容忍程度不同,lambda較嚴格,必須數量一致,Proc較寬鬆,數量有差異也不會報錯。
pnew = Proc.new { |x, y| puts x + y }
lamb = lambda { |x, y| puts x + y }

# works fine, printing 6
pnew.call(2, 4, 11)
  
# throws an ArgumentError
lamb.call(2, 4, 11)

lambda產生的物件對於傳進來的參數數目必須完全符合,不然會出錯,而Proc產生的物件就非常寬容,即使數量不符合,也還是會計算。

  1. 回傳的作用域(Scope)不同
def method_proc
  thing  = Proc.new { return 1 }
  thing.call
  puts "hi proc"
  return 2
end

def method_lambda
  thing  = lambda { return 1 }
  thing.call 
  puts "hi lambda"
  return 2
end

puts method_proc 
# => 1

puts method_lambda 
# => hi lambda
# => 2

Proc 裡面的return會結束整個method,而 lambda 的 return 只會結束 lambda 本身。

你可以這樣回答:

主要有以下兩點差異:

  1. 對參數的容忍程度不同,lambda較嚴格,必須數量一致,Proc較寬鬆,數量有差異也不會報錯。
  2. 回傳的作用域(Scope)不同,Proc裡面的return會結束整個method,而 lambda的return只會結束lambda本身。

參考資料

  1. Ruby doc
  2. Ruby Programming/Ruby basics
  3. 為你自己學 Ruby on Rails
  4. Ruby Metaprogramming 筆記(2): Proc, Lambda and Block
  5. [Ruby] 如何理解 Ruby Block

上一篇
Ruby on Rails面試題挑戰 Day10 - 在Ruby中的區塊(block)是什麼?
下一篇
Ruby on Rails面試題挑戰 Day12 - 在Ruby中的self是什麼?我們什麼時候會使用self?
系列文
Ruby on Rails面試題挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言