2013-03-07 39 views
9

爲什麼這不起作用?爲什麼`發送`失敗與Ruby 2.0精化?

module StringRefinement 
    refine String do 
    def bar 
     length 
    end 
    end 
end 

using StringRefinement 
"abcdefghijklmnopqrstuvwxyz".send(:bar) 
#NoMethodError: undefined method 'bar' for "abcdefghijklmnopqrstuvwxyz":String 

有人可以解釋爲什麼send在這裏不起作用嗎?有沒有一種方法來動態調用在精化中定義的方法?我似乎無法找到關於Ruby 2.0中的精化如何工作的完整解釋。

+1

因爲它是實驗性的嗎? – texasbruce 2013-03-07 05:20:47

+0

@oldergod真的嗎?我只是通過將上面的代碼直接複製並粘貼到pry並收到完全相同的錯誤而再次嘗試。我也使用2.0.0-p0。你確定你正在做我發佈的內容嗎? – 2013-03-07 05:43:23

+0

@SeanMackesey你是對的,我的不好。 – oldergod 2013-03-07 05:45:58

回答

9

因爲the specification是這麼說的:

間接方法訪問

任何間接的方法訪問,例如Kernel#sendKernel#method,並且Kernel#respond_to?方法查找過程中,不得兌現在主叫方面的改進。

+0

感謝澄清該Jorg。你知道爲什麼嗎? – 2013-03-07 13:31:55

0

我很想說「這是設計」。但再次it's quite possible this design is not entirely stable。例如,在幾個月前moduleclass範圍特徵已經爲removed

目前甚至紅寶石HEAD的唯一方法是使用所有罪惡的根源:

eval "puts 'abcdefghijklmnopqrstuvwxyz'.bar" # => 26 

不過說真的,這只是實驗室裏,對不對?不要解開這樣的代碼,小貓會死。