5

我只是在这个问题上停留了一段时间。拿这个基地:

module Top
  class Test
  end

  module Foo
  end
end

稍后,我可以通过执行以下操作在内部定义Foo扩展类:Test

module Top
  module Foo
    class SomeTest < Test
    end
  end
end

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

module Top::Foo
  class Failure < Test
  end
end

这失败了:

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

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

4

2 回答 2

8

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

这是一个“怪癖”。有些人认为这是一个错误。

用于查找未解析常量的父范围由模块嵌套确定。碰巧的是,当您使用 时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
于 2015-12-17T15:44:50.220 回答
1

这是意料之中的。使用::更改常量查找的范围并期望TestTop::Foo.

要获得预期的结果,您可以编写:

module Top::Foo
  class SomeTest < Top::Test
  end
end

或者:

module Top
  class Foo::SomeTest < Test
  end
end

甚至:

class Top::Foo::SomeTest < Top::Test
end
于 2015-12-17T15:34:57.820 回答