你什么时候会使用其中一种而不是另一种?
一个区别在于他们处理论点的方式。proc {}使用和创建 procProc.new {}是等效的。但是, usinglambda {}为您提供了一个 proc 来检查传递给它的参数数量。来自ri Kernel#lambda:
proc {}
Proc.new {}
lambda {}
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 中使用会从封闭块返回。
return
lambda { return :foo }.call # => :foo return # => LocalJumpError: unexpected return Proc.new { return :foo }.call # => LocalJumpError: unexpected return
因此,对于大多数快速使用来说,它们是相同的,但是如果您想要自动进行严格的参数检查(这有时也有助于调试),或者如果您需要使用return语句来返回 proc 的值,请使用lambda.
lambda