引用模块内部的常量时的行为不一致

时间:2012-06-24 17:43:44

标签: ruby-on-rails-3 module scope constants

在我的Rails 3.2 models目录中,我有一个包含两个类的文件夹“foo”:

# foo/bar.rb
class Foo::Bar; end

# foo/baz.rb
class Foo::Baz
  def self.test
    puts Bar.to_s
  end
end

请注意,Foo :: Baz.test将Foo :: Bar简称为Bar,因为Bar和Baz位于同一个模块中。

然后我打开控制台并两次调用Foo :: Baz.test:

1.9.3-p0 :001 > Foo::Baz.test
Foo::Bar
 => nil 
1.9.3-p0 :002 > Foo::Baz.test
NameError: uninitialized constant Foo::Baz::Bar
    from /../app/models/foo/baz.rb:2:in `test'

正如您所看到的,第一次呼叫正常,然后每次都崩溃。为什么呢?

如果Foo :: Baz使用完全限定名称Foo :: Bar而不是Bar,那么会发生。

1 个答案:

答案 0 :(得分:2)

如果您单独声明模块,它似乎有效:

# foo/bar.rb
module Foo
  class Bar; end
end

# foo/baz.rb
module Foo
  class Baz
    def self.test
      puts Bar.to_s
    end
  end
end

$ rails console
Loading development environment (Rails 3.2.6)
1.9.3-p125 :001 > Foo::Baz.test
Foo::Bar
 => nil 
1.9.3-p125 :002 > Foo::Baz.test
Foo::Bar
 => nil 
1.9.3-p125 :003 > 

我无法解释原因。