rubyの基礎(3)破壊的メソッドと非破壊的メソッド

rubyに限らず遭遇する話題ですが、メソッド(関数)がその処理対象のデータを書き換えるか、参照するだけかという区別として、rubyでは破壊的メソッドと非破壊的メソッドという言葉があります。

具体例でみると、

# upcase!(破壊的メソッド)
irb> s1 = "abc"
=> "abc"
irb> s2 = s1.upcase!
=> "ABC"
irb> s1
=> "ABC" # s1の内容が変更されている(実は内部では、s1とs2は同一オブジェクトを参照している)
# upcase(非破壊的メソッド)
irb> s1 = "abc"
=> "abc"
irb> s2 = s1.upcase
=> "ABC"
irb> s1
=> "abc" # s1は変更されていない(s1とs2は内部では異なるオブジェクトとして存在している)

ただし、次のように ! がない破壊的メソッドも存在します。

String クラスの <<・・・・文字列の追加
Array クラスの shift・・・レシーバの配列の最初の要素を削除しその要素を返します
Hash クラスの update・・レシーバの内容に引数の内容を加えます

「破壊的」という言葉がこわい感じですが、要はそのオブジェクトのメソッド呼び出しで、対象オブジェクトのデータ内容が壊れるよ!と強調してプログラマーに注意を促しているのです。

ちなみに上の「レシーバ」という言葉はオブジェクトと同義です。メソッドはその対象のオブジェクトに対してメッセージを送るように値を渡すので、受け取り側のオブジェクトをレシーバ(受け取り者)とも表現するのです。

この記事が気に入ったらサポートをしてみませんか?