Proc和Lambda之间的差异

Ruby在Proc.newlambda (或1.9中的->()运算符)创建的Proc.new之间存在差异。 似乎非lambda Procs将splat一个传递给块参数的数组; 通过lambda创建的过程不会。

 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) 

有没有人对这种行为背后的动机有任何见解?

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

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

或者,简而言之:lambda表现得像方法,非lambda Proc表现得像块。

您所看到的是#2的实例。 除了非lambda Proc和lambda之外,还可以尝试使用块和方法,你会看到。 (如果没有这种行为, Hash#each将是一个真正的 PITA,因为它确实产生了一个包含两个元素的数组,但你几乎总是希望将它视为两个参数。)