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

时间:2018-08-16 22:28:03

标签: ruby-on-rails ruby ruby-on-rails-5

我遇到一个问题,即将常量映射到错误的文件。调试时,它会显示奇怪的内容:

=> 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已经被另一个类包含了。

谢谢

1 个答案:

答案 0 :(得分:3)

您所描述的完全没有矛盾。

当您尝试访问App::Credential时,您正在当前常量名称空间中查找它,但是当您使用const_defined?时,您明确地询问{{1 }}是否在那里定义了常量。但是Object可以在App::Credential的子类中定义,而不是直接在Object中定义,然后将返回Object

false

由于您正在两个不同的地方看书,因此得到两个不同的答案是非常明智的。