给定以下接受一个参数的方法:
def foo(arg); p arg; end
我可以使用一个空数组来调用它:
foo([])
# prints []
我还可以将它保存为一个Method
对象,并使用一个空数组调用该方法,得到相同的结果:
method(:foo).call([])
# prints []
然而,如果我将Method
对象转换为Proc
并使用空数组调用它,我会得到一个ArgumentError
:
method(:foo).to_proc.call([])
# ArgumentError: wrong number of arguments (0 for 1)
# from (irb):4:in `foo'
# from (irb):4:in `to_proc'
# from (irb):10:in `call'
我本以为它会像前两种情况一样表现。但实际上,它似乎表现得就像我写了foo(*[])
一样。然而,如果我使用一个非空的数组来调用它,它会表现出我所期望的行为:
method(:foo).to_proc.call([1])
# prints [1]
如果参数是一个空数组,它将解构该参数,但仅在调用 Method#to_proc
时才解构。
我是否对 Method
或 Proc
的工作方式存在误解,或者这是一个 bug?
我正在运行 Ruby 1.8.7-p299。我观察到在 1.8.6-p399 和 1.8.7-head 中都有相同的行为。然而,在 1.9.1-p378 中,当使用空数组调用这三种形式时,它们都打印出 []
。