• 看一下这样想是不是更好理解一些:

    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 是有从属关系的,即上面通过嵌套方式写的代码