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"」が一つ多く生成されている事。