Ruby在通过Proc.new
和lambda
(或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)
有没有人对这种行为背后的动机有任何见解?
答案 0 :(得分:39)
lambdas和非lambda Proc
之间有两个主要区别:
Proc
从封闭方法返回,就像块一样。Proc
有宽松的参数检查,就像块一样。或者,简而言之:lambdas的行为与方法类似,非lambda Proc
的行为类似于块。
你看到的是#2的一个实例。除了非lambda Proc
和lambda之外,还可以尝试使用块和方法,你会看到。 (如果没有这种行为,Hash#each
将是一个真正的 PITA,因为它 会产生一个包含两个元素的数组,但你几乎总是希望把它当作两个论点。)