破壊的メソッドとは
オブジェクト自体を変えてしまうメソッドのことです。
例えば配列から要素を取り出してくれるslice
メソッドですが、あくまで取り出した要素を返してくれるだけで、その配列自体に変更を加えるわけではありません。
このようなものは「非破壊的メソッド」です。
一方上のslice!
は「破壊的メソッド」で、その配列自体に変更を加えます。
ちなみに破壊的メソッドの多くは!
が付いており、メソッド名だけで破壊的だと判断できることが多いです。
しかし上のdelete_at
のように!
が付かない破壊的メソッドもあります。これが本記事の主題になります。
「!」の付かない破壊的メソッド一覧
Stringクラス
concat・<<
concat
メソッドと<<
メソッドは引数で指定した文字列を結合します。
insert
insert
メソッドは引数で指定した所に文字列を挿入します。
[]=
[]=
は引数で指定した箇所の文字を置き換えます。
replace
replace
メソッドはその文字列自体を指定した文字列に置き換えます。あくまで置き換えなので同じオブジェクトのままです。
Arrayクラス
pop
pop
メソッドは配列の末尾の要素を削除します。
shift
shift
メソッドは配列の先頭の要素を削除します。
unshift
unshift
メソッドは引数に指定した要素を配列の先頭に追加します。
push・<<
push
メソッドと<<
メソッドは、引数に指定した要素を配列の末尾に追加します。
concat
concat
メソッドは引数に指定した配列を結合します。
insert
insert
メソッドは引数で指定した所に要素を挿入します。
[]=
[]=
メソッドは引数で指定した所の要素を書き換えます。
fill
fill
メソッドは配列の全要素を引数で指定した要素に変えます。
replace
replace
メソッドはその配列自体を指定した配列に置き換えます。あくまで置き換えなので同じオブジェクトのままです。
delete
delete
メソッドは引数で指定した要素を配列から削除します。
delete_at
delete_at
メソッドは引数で指定したインデックスの要素を配列から削除します。
delete_if
delete_if
メソッドは引数のブロックの条件を満たす要素を配列から削除します。
clear
`clearメソッドは配列を空にします。
Hashクラス
shift
shift
メソッドはハッシュ先頭のキーと値を削除します。
replace
replace
メソッドはそのハッシュ自体を指定したハッシュに置き換えます。あくまで置き換えなので同じオブジェクトのままです。
update
update
メソッドは引数で指定したハッシュと結合させます。既存のキーと同じものがある場合更新されます。
delete
delete
メソッドは引数で指定したキーの要素を削除します。
delete_if
clear
clear
メソッドはハッシュを空にします。
注意点
返り値について
破壊的メソッドの中には、その変更したオブジェクトが返り値とならないものがあります。
例えば上のdelete
メソッドですが、ここでは消した要素そのものが返っていますね。
Stringクラスのdeleteメソッド
ArrayクラスとHashクラスのdelete
メソッドは破壊的ですが、Stringクラスのdelete
メソッドは非破壊的です。