バリケンのRuby日記 RSSフィード

2006-05-22

[] 図解「String#+」メソッドの動作  図解「String#+」メソッドの動作 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  図解「String#+」メソッドの動作 - バリケンのRuby日記  図解「String#+」メソッドの動作 - バリケンのRuby日記 のブックマークコメント

こちらの動作を図解で追ってみるよ!

irb(main):001:0> a="aaa"
=> "aaa"
irb(main):002:0> b=a
=> "aaa"
irb(main):003:0> a=a+"bbb"
=> "aaabbb"
irb(main):004:0> b
=> "aaa"
irb(main):005:0> puts b
aaa
=> nil

じゃあ、最初の行から。

irb(main):001:0> a="aaa"
=> "aaa"

次のようなイメージになるよ。

f:id:muscovyduck:20060522092412p:image

次の行は、

irb(main):002:0> b=a
=> "aaa"

こんなイメージだね。

f:id:muscovyduck:20060522092408p:image

さて、問題の次の行。

irb(main):003:0> a=a+"bbb"
=> "aaabbb"

ここは、「String#+」メソッドの動作を理解する必要があるよ。a=a+"bbb"というのは、a=a.+("bbb")と書いたのと同じことになるんだよ。つまり、

  1. Stringクラスオブジェクトである"aaa"に対して、
  2. "bbb"というリテラル引数として、
  3. 「+」というメソッドを実行すると、
  4. その結果オブジェクトが生成され、(つまり"aaabbb")
  5. そのオブジェクトにaというラベルを(先ほどのオブジェクトからはがして)貼り付ける

という動作をしているよ。その結果は、次のようなイメージになるよ。

f:id:muscovyduck:20060522092407p:image

だから、次のような結果になるんだよ。

irb(main):004:0> b
=> "aaa"

irb(main):005:0> puts b
aaa
=> nil

ついでにaの内容も見てみると、次のようになるよ。

irb(main):006:0> a
=> "aaabbb"
irb(main):007:0> puts a
aaabbb
=> nil

あと、すべてのラベルがはがされたオブジェクトは、自動的にメモリ上から削除されるよ(ガーベージコレクションって言うんだって)。

上記の例だと、(図には描かなかったけど)実は"bbb"というオブジェクトが一瞬だけ生成されているんだけど、ラベルを貼っていないからすぐに消えてしまったんだよ。