3

オブジェクトを指す変数がなくなったときに、オブジェクトに何か特別なことが起こりますか?ガベージコレクションの対象となることは別として、つまり。

たとえば、現在、IOオブジェクトは、ガベージコレクションが行われていない場合は、ガベージコレクションされると自動的に閉じられます。この動作を変更したい場合でも、オブジェクトを指す変数がなくなったときに自動クローズが発生するように変更する方法はありませんか?

(私の質問は少し単純化したものです。WeakRefを使用すると、変数がオブジェクトをポイントし、それらをガベージコレクションのターゲットにすることができます。また、Rubyの一部の実装では、オブジェクトをポイントする変数がないオブジェクトにアクセスできます。 ObjectSpaceを使用します。IOオブジェクトに関してはIO.open(&block)、ブロックが実行された後にIOオブジェクトを自動的に閉じるようなものがあります。)

4

1 に答える 1

1

いいえ、オブジェクトへの参照がなくなったときに実行されるフックや特別なメソッドはありません。

あなたが言及する特定のケースは次のとおりです。

  • ガベージ コレクションでのリソースの自動クローズ: これはファイナライザーで実現されます

  • ブロックの終わりでのリソースの自動クローズ: ここには魔法はありません

    class IO
      def self.open(*args)
        yield file_handle = new(*args)
      ensure
        file_handle.close
      end
    end
    
  • WeakRef:ここ魔法があります :-) YARVでは、弱参照セマンティクスを提供する をlib/weakref.rb使用します。::ObjectSpace::WeakMapJRuby はWeakMap、Java のネイティブな弱参照セマンティクスを使用して実装します。IOW: これは実際には Ruby では表現できず、ランタイム システムによって提供される必要があります。

于 2012-11-29T13:06:58.417 に答える