看一下这样想是不是更好理解一些:
lz 的例子是
class A end
module A::B end
如果不执行class A end
,直接执行module A::B end
,程序会报错uninitialized constant A
未初始化常量 A
其实 module A::B end
,按照例子想要的效果,也可以用嵌套方式写成
class A
module B
end
end
这样定义后,即会有class
类型的A
常量,又会有module
类型的B
常量,也就是说B
实际上是class A
的 submodule
那么为什么不执行class A end
,直接执行module A::B end
会报错;以及 A::B 是不是一个完整
的名字这个问题,我认为只要明白 ruby 中::
语法的作用就会清晰很多了
::
语法的一个用途是访问常量
,当执行module A::B end
时,实际上在访问 A 常量下的 B 常量,这时候B
常量会作为一个 module 来声明,其作用域自然是被访问的 A 常量,报错的原因即是因为 A 常量没被定义
也就是说 A::B 称为完整
并不合适,A 和 B 是有从属关系的,即上面通过嵌套方式写的代码