>我遇到了一个问题,即常量被映射到错误的文件。调试时,它会显示奇怪的事情:
=> 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
时,
- 为什么这不会导致
const_missing
? - 为什么引用它仍然打印一些东西(这是错误的(,就好像常量是定义的(反对
Object.const_defined?
告诉我的( - 基本上我想知道在什么情况下(或者我可以在
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
由于您正在寻找两个不同的地方,因此得到两个不同的答案是完全明智的。