一个区别在于他们处理争论的方式.使用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)
此外,正如肯指出的,在lambda中使用return
返回该lambda的值,但在proc中使用return
从封闭块返回.
lambda { return :foo }.call # => :foo
return # => LocalJumpError: unexpected return
Proc.new { return :foo }.call # => LocalJumpError: unexpected return
因此,对于大多数快速使用,它们是相同的,但是如果需要自动严格参数判断(这有时也有助于调试),或者如果需要使用return
语句返回proc的值,请使用lambda
.