给定以下采用一个参数的方法:
def foo(arg); p arg; end
我可以用一个空数组来调用它:
foo([])
# prints []
我也可以将它保存为一个Method
对象并用一个空数组调用它,结果相同:
method(:foo).call([])
# prints []
但是,如果我将Method
对象转换为 a并使用空数组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
工作的理解存在差距,还是这是一个错误?
我正在运行 Ruby 1.8.7-p299。我在 1.8.6-p399 和 1.8.7-head 中观察到相同的行为。但是,我在 1.9.1-p378 中看不到它:[]
当使用空数组调用时,所有三种表单都会打印。