カテゴリ: Ruby 更新日: 2026/01/02

Ruby配列の破壊的メソッドと非破壊的メソッドを完全理解!初心者でも安全に使える配列操作

破壊的/非破壊的メソッドの違いと!の注意点【安全に使う】
破壊的/非破壊的メソッドの違いと!の注意点【安全に使う】

先生と生徒の会話形式で理解しよう

生徒

「Rubyの配列を使っていたら、いつの間にか中身が変わっていて混乱しました…」

先生

「それは破壊的メソッドを使った可能性がありますね。Rubyでは配列を直接変える操作と、変えない操作がはっきり分かれています。」

生徒

「破壊的って怖そうです…。どうやって見分ければいいんですか?」

先生

「名前の最後にある記号が大きなヒントになります。順番にやさしく見ていきましょう。」

1. 破壊的メソッドと非破壊的メソッドとは?

1. 破壊的メソッドと非破壊的メソッドとは?
1. 破壊的メソッドと非破壊的メソッドとは?

Rubyの配列には破壊的メソッド非破壊的メソッドという二つの考え方があります。 破壊的メソッドとは、元の配列そのものを書き換えてしまう操作のことです。 一方で非破壊的メソッドは、元の配列はそのままで、新しい配列を作る操作を指します。

例えるなら、紙に書いたメモを消しゴムで消して書き直すのが破壊的、 コピーを取ってから編集するのが非破壊的です。 プログラミング未経験の方は、まず「元のデータが変わるかどうか」を意識することがとても大切です。

2. !(エクスクラメーション)が付くメソッドの意味

2. !(エクスクラメーション)が付くメソッドの意味
2. !(エクスクラメーション)が付くメソッドの意味

Rubyの配列メソッドには、名前の最後に!が付いているものがあります。 この記号はエクスクラメーションマークと呼ばれ、 「元の配列を直接変更する可能性がある」という強い注意のサインです。

例えば compactcompact! は見た目が似ていますが、動きは大きく異なります。 compactnil を除いた新しい配列を返し、 compact! は元の配列から nil を削除します。


numbers = [1, nil, 2, nil, 3]
result = numbers.compact
p numbers
p result

[1, nil, 2, nil, 3]
[1, 2, 3]

この例では、元の配列は変わっていません。 これが非破壊的メソッドの特徴です。

3. 破壊的メソッドを使った場合の動き

3. 破壊的メソッドを使った場合の動き
3. 破壊的メソッドを使った場合の動き

次に compact! を使った場合を見てみましょう。 同じ処理に見えても、結果は大きく変わります。


numbers = [1, nil, 2, nil, 3]
numbers.compact!
p numbers

[1, 2, 3]

元の配列から nil が完全に消えています。 このように破壊的メソッドは便利ですが、 意図せずデータを変えてしまう危険もあります。

4. よく使われる破壊的・非破壊的メソッドの例

4. よく使われる破壊的・非破壊的メソッドの例
4. よく使われる破壊的・非破壊的メソッドの例

Rubyの配列では、次のような組み合わせがよく登場します。

  • map / map!
  • sort / sort!
  • uniq / uniq!
  • compact / compact!

非破壊的メソッドは「安全重視」、 破壊的メソッドは「処理を軽くしたい」「上書きで問題ない」場合に使われます。 初心者のうちは、まず非破壊的メソッドを選ぶと安心です。

5. 破壊的メソッドを安全に使うための考え方

5. 破壊的メソッドを安全に使うための考え方
5. 破壊的メソッドを安全に使うための考え方

破壊的メソッドを使う前に、 「この配列は後で使い回すのか?」と自分に問いかけてみてください。 もし別の処理でも使うなら、非破壊的メソッドを選ぶ方が安全です。

Rubyの配列操作では、 データを守る意識がとても重要です。 ! が付いたメソッドは便利な反面、扱いには注意が必要だということを覚えておきましょう。

関連記事:
カテゴリの一覧へ
新着記事
New1
Ruby
“すべてはオブジェクト”を体感!初心者向けRubyのオブジェクト指向入門【irbで学ぶ】
New2
Ruby
Rubyの標準入出力を完全ガイド!puts・print・pの違いとデバッグ活用法
New3
Ruby
Gemとは?RubyGemsとBundlerを初心者向けに完全解説!依存関係管理も図解でわかりやすく理解
New4
Ruby
Rubyの文字エンコーディング入門!UTF-8・マジックコメント・外部/内部エンコーディングを完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.3
Java&Spring記事人気No3
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.5
Java&Spring記事人気No5
Ruby
Rubyのfind/detect/find_indexを徹底解説!目的のデータを素早く探す方法
No.6
Java&Spring記事人気No6
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け
No.7
Java&Spring記事人気No7
Ruby
Rubyのselect/reject/filterの使い方を完全解説!初心者向けの条件抽出レシピ
No.8
Java&Spring記事人気No8
データベース
PostgreSQLで順位付け!ROW_NUMBER関数の使い方を初心者向けに徹底解説