这个问题的扩展这个问题。答案帮助我了解发生了什么,但我仍在质疑为什么。
在一个模块中定义两个类时,有两种编写方法。
使用模块块:
module Foo
class FirstClass
def meth
puts 'HELLO'
end
end
class SecondClass
def meth
FirstClass.new.meth
end
end
end
Foo::SecondClass.new.meth
Run Code Online (Sandbox Code Playgroud)
使用双冒号:
module Foo; end
class Foo::FirstClass
def meth
puts 'HELLO'
end
end
class Foo::SecondClass
def meth
FirstClass.new.meth
end
end
Foo::SecondClass.new.meth
Run Code Online (Sandbox Code Playgroud)
两种方式都适用于类定义,但是当使用双冒号时,您不能FirstClass在SecondClass不包含FirstClass或写入Foo::FirstClass. 发生这种情况是因为Foo它不是SecondClass用双冒号定义的词法范围的一部分,这可以通过使用Module.nesting.
为什么Foo不用双冒号添加到词法范围?在较低级别的 Ruby源代码的上下文中,为什么ruby_cref只指向Foo::SecondClass而不是ruby_cref指向SecondClassthen 指向Foo?
例如:
+---------+ +---------+ …Run Code Online (Sandbox Code Playgroud) ruby ×1