2006-10-28
オブジェクトと変数
Ruby の変数は C の変数と違って箱ではない。オブジェクトを参照するための'何か'だ。その'何か'がなくなるとオブジェクトは自動的にメモリから消える。
a = 'abc' a = 0 # 上で生成した文字列オブジェクトが消える
「オブジェクトを変数に代入する」ということは「オブジェクトに名前をつける」ということである、といってしまってもいいだろうか。
a = 'abc' # 文字列オブジェクトに a という名前をつける b = a # a が指している文字列オブジェクトに b という名前もつける a = 0 # 0 に a という名前をつける # 'abc' には b という名前が残っているのでオブジェクトは消えない b = 0 # 'abc' には名前がなくなってしまったので 'abc' が消滅!
ひとつのオブジェクトにはいくつでも名前をつけることが出来る。オブジェクトにつけた名前がひとつでも残っていれば、その名前でオブジェクトにアクセスできるしオブジェクトが消滅することはない。
def foo a = 'abc' return a end b = foo
C 言語だと関数の中の変数の内容はそのスコープ外では扱えないわけだが、Rubyの場合そんな不自由はない。Cの変数がメモリに割り当てられた絶対的なメモリスペース(値を保持するメモリそのもの)であるのに対して、Ruby の変数はオブジェクトにつけた名前に過ぎない。名前があればオブジェクトは生き残ることが出来る。メソッドの中で生成したオブジェクトもそのオブジェクトを指し示す名前が存在する限り生き続ける(名前が残っているということはそのオブジェクトにアクセスする手段を残しているということである)。
オブジェクトの名前がなくなってしまうともう2度とアクセスできない……かと思いきや変数名という名前がなくてもオブジェクトは生きていられる。
a = [] # 空の配列をつくり a という名前をつける a << 'abc' # 配列に文字列オブジェクトを追加 a << 'xyz'
a は配列オブジェクトの名前であって文字列オブジェクトの名前ではない。 文字列 'abc' は配列 a が所持しているのでアクセスすることが出来るし消えない。ただし配列 a が消えてしまうと文字列 'abc' も消えてしまう。
変数名がなくてもオブジェクトは生き残れる。オブジェクトが生き残れる条件とはなんなのだろう。噂のGCというやつと密接に関係していそうだ。