簡體   English   中英

ruby const_missing 方法之謎

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

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