gpt4 book ai didi

ruby const_missing 方法之谜

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:22 27 4
gpt4 key购买 nike

我在玩这段代码,纯粹是为了研究ruby对象模型和常量查找。

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 对象的单例类中,因为它是一个类方法。

所以我打算将它委托(delegate)给普通的 const_missing 方法,但是我最终得到一个错误,说堆栈太深。 binding.pry 显示它进入了一个无限循环,进入了我为我的类定义的 const_missing 方法,而不是正常的 const_missing 方法。

我想知道为什么?提前致谢。

最佳答案

问题出在下面一行:

super const_missing(name)

这里有两个语句:

  • super 期望调用父类(super class)中定义的与当前方法同名的方法
  • 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)

关于ruby const_missing 方法之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32683948/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com