当使用::?指定模块时,为什么Ruby不能在更高的范围内查找类?

Hub*_*bro 5 ruby ruby-2.2

我只是坚持了一段时间.拿这个基础:

module Top
  class Test
  end

  module Foo
  end
end
Run Code Online (Sandbox Code Playgroud)

后来,我可以通过这样做Foo来扩展内部的类Test:

module Top
  module Foo
    class SomeTest < Test
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试通过使用::指定模块来最小化缩进:

module Top::Foo
  class Failure < Test
  end
end
Run Code Online (Sandbox Code Playgroud)

这失败了:

NameError:未初始化的常量Top :: Foo :: Test

这是一个错误,还是Ruby解析变量名称的逻辑结果?

Ser*_*sev 7

这是一个错误,还是只是一个合乎逻辑的结果

这是一个"怪癖".有人认为这是一个错误.

用于查找未解析常量的父作用域由模块嵌套确定.它恰好发生在您使用时module Top::Foo,它只创建一个嵌套级别而不是两个嵌套级别.注意:

module Top
  module Foo
    class SomeTest
      Module.nesting # => [Top::Foo::SomeTest, Top::Foo, Top]
    end
  end
end

module Top::Foo
  class SomeTest
    Module.nesting # => [Top::Foo::SomeTest, Top::Foo]
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 对我来说听起来像个错误:P但是信息非常丰富,谢谢 (2认同)