5

次のようにモジュールを作成するとします。

m = Module.new do
  class C
  end
end

3 つの質問:

  • への参照以外に、内部にアクセスしたり他のものにmアクセスできる方法はありますか?Cm

  • 匿名モジュールを作成した後で名前を付けることはできますか (「module ...」と入力した場合と同じように)?

  • 無名モジュールを使い終わったら、それが定義する定数が存在しなくなるように、どうすれば無名モジュールを削除できますか?

4

3 に答える 3

7

3 つの答え:

  • はい、使用してObjectSpaceいます。このコードは、参照せずcにクラスを参照します。Cm

    c = nil  
    ObjectSpace.each_object { |obj|  
      c = obj if (Class === obj and obj.name =~ /::C$/)  
    }
    

    もちろん、これはCプログラム内のどこにも名前が付けられた他のクラスがないことに依存しますが、アイデアはわかります。

  • はい、そうです。のような定数に代入するだけで、代わりにM = mm.name返され、 のような参照が機能します。実際、これを実行して irb と入力すると、 が表示されますが、これはバグかもしれません。"M"nilM::CM::C#<Module:0x9ed509c>::C

  • 参照がなくなったら、つまり or のインスタンスまたはサブタイプがなく、別の値に設定されているか範囲外になっている場合は、ガベージ コレクションを実行する必要があると思いmます。上記のように定数に割り当てた場合は、別の値にも変更する必要があります (ただし、定数を変更することは一般的にお勧めできません)。Cm
于 2010-05-21T15:39:33.860 に答える
0

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いつものように使うことができます。

于 2012-01-18T22:54:11.197 に答える