標籤:
Proc 和 lambda 的共同點:
- 文法類似
Proc.new{|n| n**2}
lambda{|n| n**2}
- 都可以用.call方法調用
hello_proc = Proc.new{ puts "Hello!" }
hello_proc.call #Hello!
hello_lambda = lambda{ puts "Hello!" }
hello_lambda.call #Hello!
- 都可以用&關鍵字把各自轉換為block
nums = [1,3,4,5,6]
cube_proc = Proc.new{ |n| n**3 }
cube_nums_proc = nums.map(&cube_proc) #[1,27,64...]
cube_lambda = lambda{ |n| n**3 }
cube_nums_lambda = nums.map(&cube_lambda) #[1,27,64...]
- 兩者都是Object
Proc 和 lambda 的區別:
- lambda檢查傳入的參數,如果傳入不正確的參數就throw an error; Proc 則不檢查,即使傳入不正確的參數也只會忽視它,並把nil賦值給結果(assign
nil
to any that are missing.)。
- lambda返回時把控制權交還給它的調用函數,而Proc則不會交換。
def batman_ironman_proc
victor = Proc.new { return "Batman will win!" }
victor.call
"Iron Man will win!"
end
puts batman_ironman_proc
def batman_ironman_lambda
victor = lambda { return "Batman will win!" }
victor.call
"Iron Man will win!"
end
puts batman_ironman_lambda
輸出結果====》Batman will win!
Iron Man will win!
Ruby Proc 和 lambda的共同點和區別