Proc和Lambda之间的差异
Ruby在Proc.new
和lambda
(或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
之间有两个主要区别:
- 就像方法一样,lambda从自身返回,而非lambda
Proc
从封闭方法返回,就像块一样。 - 就像方法一样,lambdas有严格的参数检查,而非lambda
Proc
有松散的参数检查,就像块一样。
或者,简而言之:lambda表现得像方法,非lambda Proc
表现得像块。
您所看到的是#2的实例。 除了非lambda Proc
和lambda之外,还可以尝试使用块和方法,你会看到。 (如果没有这种行为, Hash#each
将是一个真正的 PITA,因为它确实产生了一个包含两个元素的数组,但你几乎总是希望将它视为两个参数。)