次のようにモジュールを作成するとします。
m = Module.new do
class C
end
end
3 つの質問:
への参照以外に、内部にアクセスしたり他のものに
m
アクセスできる方法はありますか?C
m
匿名モジュールを作成した後で名前を付けることはできますか (「module ...」と入力した場合と同じように)?
無名モジュールを使い終わったら、それが定義する定数が存在しなくなるように、どうすれば無名モジュールを削除できますか?
3 つの答え:
はい、使用してObjectSpace
います。このコードは、参照せずc
にクラスを参照します。C
m
c = nil
ObjectSpace.each_object { |obj|
c = obj if (Class === obj and obj.name =~ /::C$/)
}
もちろん、これはC
プログラム内のどこにも名前が付けられた他のクラスがないことに依存しますが、アイデアはわかります。
はい、そうです。のような定数に代入するだけで、代わりにM = m
がm.name
返され、 のような参照が機能します。実際、これを実行して irb と入力すると、 が表示されますが、これはバグかもしれません。"M"
nil
M::C
M::C
#<Module:0x9ed509c>::C
m
ます。上記のように定数に割り当てた場合は、別の値にも変更する必要があります (ただし、定数を変更することは一般的にお勧めできません)。C
m
Ruby 1.9.3-p0でwdebeaumの2番目の回答を試しましたが、機能しませんでした。
M::C
返さNameError: uninitialized constant M::C
れ、M.constants
返されます[]
したがって、ここで提案されているアプローチを試す必要があります
m = Module.new do
class self::C
end
end
そして、あなたはm::C
いつものように使うことができます。