Ruby配列の破壊的メソッドと非破壊的メソッドを完全理解!初心者でも安全に使える配列操作
生徒
「Rubyの配列を使っていたら、いつの間にか中身が変わっていて混乱しました…」
先生
「それは破壊的メソッドを使った可能性がありますね。Rubyでは配列を直接変える操作と、変えない操作がはっきり分かれています。」
生徒
「破壊的って怖そうです…。どうやって見分ければいいんですか?」
先生
「名前の最後にある記号が大きなヒントになります。順番にやさしく見ていきましょう。」
1. 破壊的メソッドと非破壊的メソッドとは?
Rubyの配列には破壊的メソッドと非破壊的メソッドという二つの考え方があります。 破壊的メソッドとは、元の配列そのものを書き換えてしまう操作のことです。 一方で非破壊的メソッドは、元の配列はそのままで、新しい配列を作る操作を指します。
例えるなら、紙に書いたメモを消しゴムで消して書き直すのが破壊的、 コピーを取ってから編集するのが非破壊的です。 プログラミング未経験の方は、まず「元のデータが変わるかどうか」を意識することがとても大切です。
2. !(エクスクラメーション)が付くメソッドの意味
Rubyの配列メソッドには、名前の最後に!が付いているものがあります。 この記号はエクスクラメーションマークと呼ばれ、 「元の配列を直接変更する可能性がある」という強い注意のサインです。
例えば compact と compact! は見た目が似ていますが、動きは大きく異なります。
compact は nil を除いた新しい配列を返し、
compact! は元の配列から nil を削除します。
numbers = [1, nil, 2, nil, 3]
result = numbers.compact
p numbers
p result
[1, nil, 2, nil, 3]
[1, 2, 3]
この例では、元の配列は変わっていません。 これが非破壊的メソッドの特徴です。
3. 破壊的メソッドを使った場合の動き
次に compact! を使った場合を見てみましょう。
同じ処理に見えても、結果は大きく変わります。
numbers = [1, nil, 2, nil, 3]
numbers.compact!
p numbers
[1, 2, 3]
元の配列から nil が完全に消えています。
このように破壊的メソッドは便利ですが、
意図せずデータを変えてしまう危険もあります。
4. よく使われる破壊的・非破壊的メソッドの例
Rubyの配列では、次のような組み合わせがよく登場します。
- map / map!
- sort / sort!
- uniq / uniq!
- compact / compact!
非破壊的メソッドは「安全重視」、 破壊的メソッドは「処理を軽くしたい」「上書きで問題ない」場合に使われます。 初心者のうちは、まず非破壊的メソッドを選ぶと安心です。
5. 破壊的メソッドを安全に使うための考え方
破壊的メソッドを使う前に、 「この配列は後で使い回すのか?」と自分に問いかけてみてください。 もし別の処理でも使うなら、非破壊的メソッドを選ぶ方が安全です。
Rubyの配列操作では、 データを守る意識がとても重要です。 ! が付いたメソッドは便利な反面、扱いには注意が必要だということを覚えておきましょう。