gpt4 book ai didi

ruby - 为什么在 Ruby 中屈服于 lambda splat 数组参数?

转载 作者:数据小太阳 更新时间:2023-10-29 06:49:57 26 4
gpt4 key购买 nike

在 Ruby 中,使用错误数量的参数调用 lambda 会导致 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 (*) 将数组转换为参数列表,但我没有。

但是 ... 如果我通过yield 隐式调用lambda,就会发生意想不到的事情:

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!?

更令人困惑的是,通过 Method#to_proc 派生的 lambda 确实按预期工作:

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)

这是怎么回事?

最佳答案

我在这里回答我自己的问题,因为这是一个已知的错误:

https://bugs.ruby-lang.org/issues/12705

它在 Ruby 2.4.1 中得到修复(感谢@ndn)

关于ruby - 为什么在 Ruby 中屈服于 lambda splat 数组参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41870576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com