ObjectSpace

id:rubycoさんの日記は面白い。
http://d.hatena.ne.jp/rubyco/20060304/objectspace


ObjectSpaceを使うと特定のクラスの全オブジェクトをイテレートできるそうな。


Stringの連結で試してみる。

str = "abcA"
str += "B"
str += "C"
str += "D"
str += "E"

ObjectSpace.each_object(String) do |o|
  if o =~ /^abc/
    p o + ":" + o.object_id.to_s
  end
end

- 結果 -

"abcABCDE:21619100"
"abcABCD:21619124"
"abcABC:21619160"
"abcAB:21619196"
"abcA:21619220"
"abcA:21620372"

なるほど。


連結の仕方を変えてみる。

str = "abcA"
str << "B"
str << "C"
str << "D"
str << "E"

ObjectSpace.each_object(String) do |o|
  if o =~ /^abc/
    p o + ":" + o.object_id.to_s
  end
end


- 結果 -

"abcABCDE:21619256"
"abcA:21620120"
self + other

文字列を連結した新しい文字列を返します。

self << other

文字列 other の内容を self に連結します。


無駄なオブジェクトを生成してしまうので、連結する場合は「<<」を使えってことですね。


一つ気になるのは「"abcA:21620120"」が一つ多く生成されている事。