Proc和Lambda之间的差异

Bri*_*ian 21 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)
Run Code Online (Sandbox Code Playgroud)

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

Jör*_*tag 39

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

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

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

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