可以将匿名模块和类嵌套在Ruby中吗?

我可以在匿名模块中定义一个匿名类:

c = nil m = Module.new do c = Class.new end m #=> # c #=> # 

以上是否相当于:

 m = Module.new c = Class.new 

换句话说:“嵌套”的概念是否真的适用于匿名模块?

这不是匿名。 将动态创建的类分配给常量使其命名为:

 Foo = Class.new # => Foo foo = Class.new # => # 

但它仍然没有进一步嵌套:

 module Bar Baz = Module.new do p Module.nesting # => [Bar] end end 

甚至关于这个问题的动态:

 module Quz eval 'module Qux; p Module.nesting; end' # => [Quz::Qux, Quz] end 

这是关于范围门。


就常量而言,只有两个范围门 – 关键字classmodule

嵌套完全是语法上的。 这就是你得到奇怪的原因:

 module Do X = 42 end module Do module Re p Module.nesting # => [Do::Re, Do] p X # => 42 end end module Do::Mi p Module.nesting # => [Do::Mi] p X # => uninitialized constant end Do.module_eval { p X } # => uninitialized constant Do.instance_eval { p X } # => uninitialized constant 

因此,如果Ruby看到关键字classmodule ,它会进一步嵌套“当前节点” 。 当找到结束end ,它会上升到树上。 定义新常量时,会将其放在当前节点中。

Interesting Posts