【Ruby】rejectメソッドの使い方 | reject!やdelete_ifとの違いについても解説

最終更新日:

この記事では、

    • rejectメソッドの基本
    • rejectメソッドの活用例
    • selectメソッドとの比較と違い

    について解説していきたいと思います。

    DAI
    簡単に説明すると、繰り返し処理をした時に、条件に合致しないものを除くメソッドとなります

    rejectメソッドの基本

    Rubyにおいて「rejectメソッド」は配列やハッシュから、特定の条件に当てはまる要素を除外するのに使用されます。具体的には、ブロックで定義した条件がtrueを返す要素を除外し、falseを返す要素のみを新しい配列として返します。
    これを使うことで、不要な要素を効率的に排除できます。

    numbers = [1, 2, 3, 4, 5]
    even_numbers = numbers.reject { |number| number.even? }
    puts even_numbers.inspect # => [1, 3, 5]

    このサンプルコードでは、配列numbersから偶数を除外しています。

    ブロック内のnumber.even?で偶数を判断しており、これがtrueを返す要素がrejectメソッドにより除外され、結果として奇数のみがeven_numbers配列に格納されています。

    DAI
    これを仮にselectで書くと、こうなります。selectの逆バージョンと理解するとよいでしょう。
    numbers = [1, 2, 3, 4, 5]
    even_numbers = numbers.select { |number| number.odd? }
    puts even_numbers.inspect # => [1, 3, 5]

    配列での使用例

    Rubyのプログラミングでは、配列内の要素を操作する機会が多くあります。特に、特定の条件に一致する要素だけを取り除きたい場合にrejectメソッドは役立ちます。

    animals = ['dog', 'cat', 'elephant', 'bird']
    no_birds = animals.reject { |animal| animal == 'bird' }
    puts no_birds.inspect # => ["dog", "cat", "elephant"]

    上記の例では、'bird'を配列から除外しています。

    関連:Rubyの配列操作完全マニュアル | 追加 / 更新 / 削除 / 繰り返しの方法について現役エンジニアが解説

    Rubyの配列操作完全マニュアル | 追加 / 更新 / 削除 / 繰り返しの方法について現役エンジニアが解説

    二次元配列での使用例

    二次元配列においてもrejectメソッドは有用です。条件に合わないサブ配列全体を除外できます。

    pairs = [[1, 2], [3, 4], [5, 6]]
    no_even_pairs = pairs.reject { |pair| pair[0].even? }
    puts no_even_pairs.inspect # => [[1, 2], [5, 6]]

    この例では、サブ配列の最初の要素が偶数であるペアを除外しています。

    ハッシュでの使用例

    ハッシュに対しても、rejectメソッドを使用できます。この場合、キーと値のペアに対して条件を適用します。

    scores = { alice: 50, bob: 60, carol: 70 }
    high_scores = scores.reject { |_name, score| score < 60 }
    puts high_scores.inspect # => {:bob=>60, :carol=>70}

    50点未満のスコアを持つエントリーを除外しています。

    関連:【Ruby】 hashの使い方完全マニュアル | 追加, 更新, 削除, 高度な利用方法について現役エンジニアが解説します

    selectメソッドとの比較

    rejectメソッドと並び、selectメソッドも配列やハッシュの要素を選択するのによく用いられますが、その動作は反対です。

    selectメソッドはブロック内の条件がtrueを返す要素を選択しますが、rejectメソッドtrueを返す要素を除外します。

    関連:【Ruby】 selectメソッド完全マニュアル | 基礎から応用・filterとの違いについても解説

    rejectを破壊的に利用する: delete_ifとの違いについて

    rejectメソッドは非破壊的なメソッドです。つまり、元の配列やハッシュを変更せずに新しいオブジェクトを返します。

    しかし、破壊的な操作が必要な場合、delete_ifメソッドが利用できます。このメソッドは元の配列やハッシュを直接変更し、条件にマッチする要素を削除します。

    破壊的な操作と非破壊的な操作の選択はプログラムの設計に大きく影響しますので、それぞれのメソッドの特性を理解し、適切に使い分けることが重要です。

    rejectとreject!との違いについて

    reject!  は、rejectの破壊的バージョンです。よって、delete_ifと同じメソッド(エイリアス)となります。

    以下に`reject!`メソッドの使用方法を示すサンプルコードを紹介します。

    # 文字列の配列から特定の文字列を削除する例
    words = ["apple", "banana", "cherry", "date"]
    words.reject! { |word| word.start_with?("b") }
    puts words.inspect
    # 出力: ["apple", "cherry", "date"]

    関連:【Ruby】rejectメソッドの使い方 | reject!やdelete_ifとの違いについても解説

    参考文献