在Ruby中,lambda
使用错误数量的参数调用a会导致ArgumentError
:
l = lambda { |a, b| p a: a, b: b } l.call(1, 2) # {:a=>1, :b=>2} l.call(1) # ArgumentError: wrong number of arguments (given 1, expected 2)
传递数组也不起作用:(因为数组只是一个对象,对吧?)
l.call([3, 4]) # ArgumentError: wrong number of arguments (given 1, expected 2)
除非我使用splat(*
)将数组转换为参数列表,否则我没有.
但是 ......如果我通过隐式调用lambda yield
,会发生意外情况:
def yield_to yield(1, 2) yield([3, 4]) end yield_to(&l) # {:a=>1, :b=>2} # {:a=>3, :b=>4} <- array as argument list!?
更令人困惑的是,lambda派生的via Method#to_proc
会按预期工作:
def m(a, b) p a: a, b: b end yield_to(&method(:m)) # {:a=>1, :b=>2} # ArgumentError: wrong number of arguments (given 1, expected 2)
这里发生了什么?