簡體   English   中英

這是Method#to_proc中的錯誤嗎? (Ruby 1.8.7)

[英]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

我對MethodProc如何工作的理解是否有差距,或者這是一個錯誤?

我正在運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM