Proc和Lambda之间的区别

22

在Ruby中,使用Proc.newlambda(或1.9中的->()运算符)创建的Proc之间存在差异。似乎非lambda Proc会将传递的数组展开到块参数上;而通过lambda创建的Proc则不会。

p = Proc.new { |a,b| a + b}
p[[1,2]] # => 3

l = lambda { |a,b| a + b }
l[[1,2]] # => ArgumentError: wrong number of arguments (1 for 2)

有人能解释一下这种行为背后的动机吗?


3
或许您已经知道了,这段代码的作用是:l = lambda{ |(a,b)| a+b }; l[[1,2]] #=> 3。它定义了一个名为 l 的 lambda 函数,该函数接受一个带有两个元素的数组作为参数,并返回这两个元素的总和。在调用 l 函数时,它被传递一个数组 [1,2] 作为参数,因此返回值为 3 - Phrogz
1个回答

39

lambdas和非lambda的Proc有两个主要区别:

  1. 像方法一样,lambda从它们自己返回,而非lambda的Proc从封闭的方法中返回,就像块一样。
  2. 像方法一样,lambda具有严格的参数检查,而非lambda的Proc具有松散的参数检查,就像块一样。

或者简单说:lambdas行为类似于方法,非lambda的Proc行为类似于块。

你看到的是#2的一个实例。除了非lambda的Proc和lambda之外,还可以尝试使用块和方法,然后您会发现不同(如果没有此行为,则Hash#each将使用起来非常麻烦,因为它确实会产生具有两个元素的数组,但您几乎总是想将其作为两个参数处理。)


1
感谢您的快速回复。正是通过使用#each / #sort,我第一次接触到了这个问题。最终,我使用以下语法来避免Proc.new的冗长:->((a,b)) { ... } - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接