Proc和Lambda之间的差异

时间:2011-01-25 23:21:58

标签: ruby functional-programming

Ruby在通过Proc.newlambda(或1.9中的->()运算符)创建的Proc之间存在差异。似乎非lambda Procs将在一个块参数中传递一个数组。通过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)

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

1 个答案:

答案 0 :(得分:39)

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

  1. 就像方法一样,lambda从自身返回,而非lambda Proc从封闭方法返回,就像块一样。
  2. 就像方法一样,lambda有严格的参数检查,而非lambda Proc有宽松的参数检查,就像块一样。
  3. 或者,简而言之:lambdas的行为与方法类似,非lambda Proc的行为类似于块。

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