Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > ObjectSpaceモジュール

module ObjectSpace

クラスの継承リスト: ObjectSpace

要約

全てのオブジェクトを操作するためのモジュールです。

目次

モジュール関数
_id2ref add_finalizer call_finalizer define_finalizer each_object finalizers garbage_collect remove_finalizer undefine_finalizer

モジュール関数

_id2ref(id) -> object[permalink][rdoc]

オブジェクト ID(Object#__id__)からオブジェクトを得ます。

[PARAM] id:
取得したいオブジェクトの ID を整数で指定します。
[EXCEPTION] RangeError:
対応するオブジェクトが存在しなければ発生します。
a = "hoge"
p ObjectSpace._id2ref(a.__id__) #=> "hoge"
add_finalizer(proc) -> Proc[permalink][rdoc]

このメソッドは obsolete です。代わりに ObjectSpace.#define_finalizer を使用してください。

proc をファイナライザとして設定します。 proc を返します。

ObjectSpace.#call_finalizer で指定したオブジェクトが解放され る時、そのオブジェクトの ID(c.f Object#__id__)を引数に ファイナライザが評価されます。

[PARAM] proc:
ファイナライザとしたい Proc オブジェクトを指定します。
call_finalizer(obj) -> object[permalink][rdoc]

このメソッドは obsolete です。

obj をファイナライザの対象オブジェクトとして設定します。 obj を返します。

[PARAM] obj:
ファイナライザの対象とするオブジェクトを指定します。
define_finalizer(obj, proc) -> Array[permalink][rdoc]
define_finalizer(obj) {|id| ...} -> Array

obj が解放されるときに実行されるファイナライザ proc を 登録します。同じオブジェクトについて複数回呼ばれたときは置き換えで はなく追加登録されます。現在のセーフレベルと proc を配列にして返します。

ブロックを指定した場合は、そのブロックがファイナライザになります。 obj の回収時にブロックは obj の ID (Object#__id__)を引数として実行されます。 しかし、後述の問題があるのでブロックでファイナライザを登録するのは難しいでしょう。

[PARAM] obj:
ファイナライザを登録したいオブジェクトを指定します。
[PARAM] proc:
ファイナライザとして Proc オブジェクトを指定します。proc は obj の回収時に obj の ID を引数として実行されます。

使い方の注意

以下は、define_finalizer の使い方の悪い例です。

class Foo
  def initialize
    ObjectSpace.define_finalizer(self) {
      puts "foo"
    }
  end
end
Foo.new
GC.start

これは、渡された proc の self が obj を参照しつ づけるため。そのオブジェクトが GC の対象になりません。

tempfile は、ファイナライザの使い方の 良い例になっています。これは、クラスのコンテキストで Proc を 生成することで上記の問題を回避しています。

class Bar
  def Bar.callback
    proc {
      puts "bar"
    }
  end
  def initialize
    ObjectSpace.define_finalizer(self, Bar.callback)
  end
end
Bar.new
GC.start

proc の呼び出しで発生した大域脱出(exitや例外)は無視されます。 これは、スクリプトのメイン処理が GC の発生によって非同期に中断され るのを防ぐためです。不安なうちは -d オプションで 事前に例外の発生の有無を確認しておいた方が良いでしょう。

class Baz
  def initialize
    ObjectSpace.define_finalizer self, eval %q{
      proc {
        raise "baz" rescue puts $!
        raise "baz2"
        puts "baz3"
      }
    }, TOPLEVEL_BINDING
  end
end
Baz.new
GC.start

# => baz

[SEE_ALSO] Rubyの起動

each_object {|object| ...} -> Integer[permalink][rdoc]
each_object(klass) {|object| ...} -> Integer
each_object -> Enumerable::Enumerator
each_object(klass) -> Enumerable::Enumerator

指定された klass と Object#kind_of? の関係にある全ての オブジェクトに対して繰り返します。引数が省略された時には全てのオブ ジェクトに対して繰り返します。 繰り返した数を返します。

ブロックが与えられなかった場合は、 Enumerable::Enumerator オブジェクトを返します。

次のクラスのオブジェクトについては繰り返しません

とくに、klass に FixnumSymbol などのクラスを指定した場合は、 何も繰り返さないことになります。 なお、Symbol については、かわりに Symbol.all_symbols が使用できます。

[PARAM] klass:
クラスかモジュールを指定します。
finalizers -> [Proc][permalink][rdoc]

このメソッドは obsolete です。

現在登録されているファイナライザの配列を返します。

garbage_collect -> nil[permalink][rdoc]

どこからも参照されなくなったオブジェクトを回収します。 GC.start と同じです。

remove_finalizer(proc) -> Proc[permalink][rdoc]

このメソッドは obsolete です。代わりに ObjectSpace.#undefine_finalizer を使用してくださ い。

指定した proc をファイナライザから取り除きます。 proc を返します。

[PARAM] proc:
取り除きたいファイナライザである Proc オブジェクトを指定します。
undefine_finalizer(obj) -> object[permalink][rdoc]

obj に対するファイナライザをすべて解除します。 obj を返します。

[PARAM] obj:
ファイナライザを解除したいオブジェクトを指定します。