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產生的物件差異在哪裡?
主要有以下兩個差異點
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產生的物件就非常寬容,即使數量不符合,也還是會計算。
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 本身。
主要有以下兩點差異: