匿名ではありません。
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
-
は限り定数が懸念しているように、2つのだけのスコープゲートがあります。
ネスティングは純粋に構文的に行われます。あなたは奇妙なを取得する理由は次のとおりです。Rubyのキーワード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
だから、それはさらに「現在のノード」を入れ子にします。終了end
が見つかると、ツリーの上に上がります。新しい定数が定義されると、それは現在のノードに配置されます。
出典
2016-11-30 16:37:20
ndn
「定義」の下に定義 –
興味深い匿名モジュールはModule.nestingに登録されていません –
@SergioTulentsev私の質問に言い換えれば、まったく入れ子がないかもしれません。 – Stefan