2011-05-21 63 views
2

看起來像const_missingObject的實例方法。如果是這樣,爲什麼這個代碼不工作?爲什麼const_missing沒有在Object前面加上前綴?

module Extensions 
    def const_missing(c) 
    puts c 
    end 
end 

class Object 
    include Extensions 
end 

NonExistent.new 

爲了讓它正常工作,我必須要改變def const_missingdef Object.const_missing。爲什麼?

+1

因爲在包含的模塊之前調用了正確的方法。 – 2011-05-21 21:43:16

+0

你是什麼意思「正確的方法」? – ryeguy 2011-05-21 21:44:24

+0

[重寫方法由另一個在模塊中定義]的可能重複(http://stackoverflow.com/questions/5944278/overriding-method-by-another-defined-in-module) – Phrogz 2011-05-21 21:57:42

回答

2

這只是方法調用在Ruby中解析方式的結果。

首先,檢查單例方法。然後是該類的實例方法,其次是祖先(這將是包含的模塊,然後是包含它們的模塊的超類)。

所以,你可以直接定義Object.const_missing,或包含在單獨的類對象的模塊:

class << Object 
    include Extensions 
end 

NonExistent # => prints "NonExistent" 

你也可以猴補丁Module#const_missing

相關問題