破壊的メソッドと非破壊的メソッドの話
破壊的メソッドと非破壊的メソッドの違いと「!」についての要点をざっくりまとめました。
破壊的メソッドとは
レシーバであるオブジェクトそのものに変更を加えるメソッドのことです。
非破壊的メソッドは、その場の実行結果のみに影響しますが、破壊的メソッドは自分自身に変更を加えてしまいます。
破壊的メソッドの例
popは、配列の末尾の要素を削除してそれ自身を返し、そしてレシーバ自体を変更する破壊的メソッドです。
下記のような場合、レシーバ自体に変更がかかっていることがわかります。
# 変数aに配列を代入する a = ["hedge", "rabbit", "tiger"] # 変数aの末尾の要素("tiger")を削除してそれを返す a.pop => ["tiger"] # レシーバである変数a自体にも変更が加わっていることがわかる p a => ["hedge", "rabbit"]
非破壊的メソッドの例
sliceは、引数に応じて文字列の中から部分文字列を取り出すsliceは非破壊的メソッドです。
下記のような場合、レシーバ自体には変更がかかっていないことがわかります。
# 変数aに配列を代入する a = ["hedge", "rabbit", "tiger"] # 指定した要素を自身から取り除き、取り除いた要素を返す a.slice(0..1) => ["hedge", "rabbit"] # レシーバである変数aそのものには変更が加わっていないことがわかる p a => ["hedge", "rabbit", "tiger"]
破壊的メソッドと!
上記に登場したslice
は破壊的メソッドですが、同じ機能をもつslice!
は破壊的メソッドです。
破壊的メソッドには、!
がついていることが多いですが、pop
やshift
など、!
のつかない破壊的メソッドもあります。
slice
とslice!
のように、同じ機能をもつメソッドに、破壊的メソッドと非破壊的メソッドのパターンがある場合などは、破壊的メソッドの方に!
がついてるようです。
参照記事
”!”についての見解を詳しく書いてくださっていて大変参考になりましたmm qiita.com