小编典典

Ruby 中的 proc 和 lambda 有什么区别?

all

你什么时候会使用其中一种而不是另一种?


阅读 68

收藏
2022-06-21

共1个答案

小编典典

一个区别在于他们处理论点的方式。proc {}使用和创建 procProc.new {}是等效的。但是, usinglambda {}为您提供了一个 proc 来检查传递给它的参数数量。来自ri Kernel#lambda

等效于 Proc.new ,除了生成的 Proc 对象检查调用时传递的参数数量。

一个例子:

p = Proc.new {|a, b| puts a**2+b**2 } # => #<Proc:0x3c7d28@(irb):1>
p.call 1, 2 # => 5
p.call 1 # => NoMethodError: undefined method `**' for nil:NilClass
p.call 1, 2, 3 # => 5
l = lambda {|a, b| puts a**2+b**2 } # => #<Proc:0x15016c@(irb):5 (lambda)>
l.call 1, 2 # => 5
l.call 1 # => ArgumentError: wrong number of arguments (1 for 2)
l.call 1, 2, 3 # => ArgumentError: wrong number of arguments (3 for 2)

此外,正如 Ken 指出的那样,return在 lambda 中使用会返回该 lambda 的值,但return在 proc 中使用会从封闭块返回。

lambda { return :foo }.call # => :foo
return # => LocalJumpError: unexpected return
Proc.new { return :foo }.call # => LocalJumpError: unexpected return

因此,对于大多数快速使用来说,它们是相同的,但是如果您想要自动进​​行严格的参数检查(这有时也有助于调试),或者如果您需要使用return语句来返回
proc 的值,请使用lambda.

2022-06-21