我可以在匿名模块中定义一个匿名类:
c = nil
m = Module.new do
c = Class.new
end
m #=> #<Module:0x007fad3a055660>
c #=> #<Class:0x007fad3a0555e8>
以上是否相当于:
m = Module.new
c = Class.new
换句话说:“嵌套”的概念是否真的适用于匿名模块?
答案 0 :(得分:2)
这不是匿名。将动态创建的类分配给常量使其命名为:
Foo = Class.new # => Foo
foo = Class.new # => #<Class:0x007fe5dd45d650>
但它仍然没有进一步嵌套:
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
关于范围门。
就常数而言,只有两个范围门 - 关键字class
和module
。
嵌套完全是语法上的。这就是你得到奇怪的原因:
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看到关键字class
或module
,则会进一步嵌套&#34;当前节点&#34; 。当找到结束end
时,它会上升到树上。当定义新常量时,它将它放在当前节点中。