[英]Is this a bug in Method#to_proc? (Ruby 1.8.7)
給出以下帶有一個參數的方法:
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(*[])
。 但是,如果我有一個非 -empty陣列稱呼它,它確實表現我預期的方式:
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中看到它:當使用空數組調用時,所有三個表單都打印[]
。
這幾乎肯定是一個bug,
我懷疑發生這種情況的原因是Method#call有arity -1(期望C數組的參數),而Proc#call有arity -2(期望Ruby數組的參數)。
在eval.c中,在Proc#call的定義之上還有一個有用的注釋,可以進一步說明問題:
/ * CHECKME:參數檢查語義是否正確? * /
也許我們應該將其改為FIXME:p
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.