又再测试一下,发现前面讲的 A::B 是一个完整的名字,是错的,因为能访问到单独的 B,
p A.ancestors #=>[A, Object, Kernel, BasicObject]
p A::B.ancestors #=>[A::B]
p A.constants[0] #=>:B
p A.constants[0].class #=>Symbol
能看到的 A 既是类也是模块,再深入看到上面的结果又迷糊了
那么为什么不执行class A end,直接执行module A::B end会报错;以及 A::B 是不是一个完整的名字这个问题,我认为只要明白 ruby 中::语法的作用就会清晰很多了
::语法的一个用途是访问常量,当执行module A::B end时,实际上在访问 A 常量下的 B 常量,这时候B常量会作为一个 module 来声明,其作用域自然是被访问的 A 常量,报错的原因即是因为 A 常量没被定义
也就是说 A::B 称为完整并不合适,A 和 B 是有从属关系的,即上面通过嵌套方式写的代码