【Ruby】rejectメソッドの使い方 | reject!やdelete_ifとの違いについても解説
この記事では、
- rejectメソッドの基本
- rejectメソッドの活用例
- selectメソッドとの比較と違い
について解説していきたいと思います。
目次 (PRも含まれます)
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
配列に格納されています。
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の配列操作完全マニュアル | 追加 / 更新 / 削除 / 繰り返しの方法について現役エンジニアが解説
二次元配列での使用例
二次元配列においても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との違いについても解説