0

如果我在 irb 中执行以下操作:

module Useless ; end

Useless.const_defined? 'Test'

它显然返回

=> false

但是当我在我的任何 Rails 应用程序控制台中执行相同操作时,答案是:

=> true

我的第一个猜测是我在某种程度上与测试框架发生冲突。我想知道是哪一个,当我注意到即使返回“true”,它似乎仍然未定义时,它变得很奇怪......

irb(main):004:0> Useless::Test
NameError: uninitialized constant Useless::Test
    from (irb):4
    from /home/laurent/.rvm/gems/ruby-2.0.0-p0@nanoscripts/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
    from /home/laurent/.rvm/gems/ruby-2.0.0-p0@nanoscripts/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
    from /home/laurent/.rvm/gems/ruby-2.0.0-p0@nanoscripts/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

有人对此有解释吗?

当然我知道我应该避免将模块命名为“Test”,但关键是我正在动态地将一些类和模块生成到一个模块中,我将其用作数据库自省的命名空间。因此,没有什么可以阻止将表命名为 test (这就是我发现这件事的方式),这会触发创建一个名为:

MyNameSpaceForDynamicallyCreatedObjectsFromDatabase::Test

基本上我该怎么办?

  • 硬编码测试的东西?然后是否有一个详尽的表名列表,我应该对其进行硬编码?
  • 是否有另一种方法可以确定模块中是否存在常量而不干扰我与之冲突的任何底层机制?

任何帮助表示赞赏。Rgds

4

1 回答 1

0

实际上,我可以通过执行 aconstants.include? 'Test'.to_sym而不是来解决const_defined?

module Useless ; end

Useless.constants.include? 'Test'.to_sym

正确返回预期:

=> false

这在原始红宝石和铁轨中都是如此。

唯一的缺点是常量返回一个符号数组。这解决了我的问题,但没有解释这种const_defined?行为的原因。

于 2013-05-12T06:36:24.980 回答