引用失败的常量时,Object.const_defined?,它不会调用const_missing



>我遇到了一个问题,即常量被映射到错误的文件。调试时,它会显示奇怪的事情:

=> 1: class App::CloudCredential < App::Credential
2: end
(byebug) Object.const_defined? "App::Credential"
false
(byebug) App::Credential
App::Shared::Credential
(byebug) App::Credential.class
Module
(byebug) App::Credential.name
"App::Shared::Credential" 

我的问题是,当Object.const_defined? "App::Credential"返回false时,

  1. 为什么这不会导致const_missing
  2. 为什么引用它仍然打印一些东西(这是错误的(,就好像常量是定义的(反对Object.const_defined?告诉我的(
  3. 基本上我想知道在什么情况下(或者我可以在byebug中使用什么样的测试(会导致const_missing。我试图找出为什么这个App::Credential被映射到一个完全错误的文件(App::Shared::Credential的文件(

详细信息:此App::Shared::Credential实际上是从class App::Credential中包含的模块,并且此App::Shared::Credential已被另一个类包含。

谢谢

你描述的一点也不矛盾。

当您尝试访问App::Credential时,您将在当前常量命名空间中查找它,但是当您使用const_defined?时,您显式询问Object常量是否在那里定义。但是App::Credential可以在Object的子类中定义,而不是直接在Object中定义,然后这将返回false

module Foo
module Bar
Baz = 42
end
const_defined? 'Bar::Baz'
#=> true
Object.const_defined? 'Bar::Baz'
#=> false
end

由于您正在寻找两个不同的地方,因此得到两个不同的答案是完全明智的。

最新更新