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

2006-05-22

[] Rubyの「破壊的メソッド」  Rubyの「破壊的メソッド」 - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Rubyの「破壊的メソッド」 - バリケンのRuby日記  Rubyの「破壊的メソッド」 - バリケンのRuby日記 のブックマークコメント

Rubyインスタンスメソッドのうち、オブジェクト自身の内容を変えてしまうようなものを「破壊的メソッド」と呼ぶよ。多くの破壊的メソッドには、メソッド名の最後に「!」が付いているよ。

例として、破壊的じゃない「String#chop」と、破壊的な「String#chop!」の違いを図解で追ってみるよ。まずは破壊的じゃないメソッド「String#chop」の例だよ。

a = "abc"
b = a.chop
puts a
puts b

まずは、最初の行。

a = "abc"

こういうイメージだね。

f:id:muscovyduck:20060522114055p:image

そして、問題の次の行。

b = a.chop

これは、次のような動作をしているよ。

  1. Stringクラスオブジェクトである"abc"に対して、
  2. chop」というメソッドの実行を依頼すると、
  3. その結果オブジェクトが生成され、(つまり"ab")
  4. そのオブジェクトにbというラベルを貼り付ける

その結果のイメージは、次のようになるよ。

f:id:muscovyduck:20060522114053p:image

だから、このスクリプトの実行結果は次のようになるんだね。

abc
ab

次は、破壊的なメソッド「String#chop!」の例だよ。

a = "abc"
b = a.chop!
puts a
puts b

最初の行は、さっきと同じだよね。

a = "abc"

こういうイメージだね。

f:id:muscovyduck:20060522114055p:image

そして、いよいよ次の行。

b = a.chop!

これは、次のような動作をしているよ。

  1. Stringクラスオブジェクトである"abc"に対して、
  2. chop!」というメソッドの実行を依頼すると、
  3. その結果オブジェクト自身が破壊され、("ab"に変化した!)
  4. そのオブジェクトにbというラベルも貼り付ける

その結果のイメージは、次のようになるよ。

f:id:muscovyduck:20060522114054p:image

なので、このスクリプトの実行結果は、次のようになるよ。

ab
ab