[英]Ruby: Redefining const_missing method in Module's singleton class
[英]ruby const_missing method mystery
我正在使用這段代碼,純粹是為了研究 ruby 對象模型和 const 查找。
class TestClass
def self.const_missing(name)
binding.pry
super const_missing(name)
end
def self.do
self.class_eval "puts 800; UNKOWNCONST"
end
end
TestClass.do
由於 class_eval 在類內部完成,因此“UNKOWNCONST”將觸發上面定義的 const_missing,它位於 TestClass 對象的單例類中,因為它是一個類方法。
所以我打算將它委托給普通的 const_missing 方法,但是我最終得到了一個錯誤,說堆棧太深。 binding.pry 顯示它進入無限循環,進入我為我的類定義的 const_missing 方法,而不是普通的 const_missing 方法。
我想知道為什么? 提前致謝。
問題是以下幾行:
super const_missing(name)
在這里你有兩個聲明:
super
期望調用與當前方法同名的超類中定義的方法const_missing(name)
調用const_missing
調用父對象的正確方法是調用super
,不帶參數或傳遞顯式參數。 相反,在您的示例中,您還調用const_missing(name)
並且會發生的是 super 永遠不會被調用,因為您將進入一個遞歸循環,其中const_missing
不斷調用自身。
正確的代碼是
def self.const_missing(name)
binding.pry
super(name)
end
實際上,這會按預期觸發錯誤
$ ruby test.rb
800
test.rb:9:in `class_eval': uninitialized constant TestClass::UNKOWNCONST (NameError)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.