こんにちは。Tomoyuki(@tomoyuki65)です。
Rubyの配列の使い方を理解した方は、使用頻度が高いメソッドも覚えましょう。
特にリファクタリング時に使えないかを検討すると良いと思います。
この記事では、配列で覚えるべきメソッドについて解説します。
map(collect)
mapメソッド(エイリアスメソッドはcollect)は、配列の各要素に対してブロックを評価した結果を新しい配列にして返します。
例えば以下のようなプログラムがあったとします。
# 配列の各要素を3で割った余りを新しい配列に格納する場合
num = [10, 20, 30]
new_num = []
num.each { |n| new_num << n % 3 }
p new_num
次のように書き換えることができます。
# 配列の各要素を3で割った余りを新しい配列に格納する場合
num = [10, 20, 30]
new_num = num.map { |n| n % 3 }
p new_num
このように、空の配列を用意して他の配列の要素を詰め込むような処理は、mapメソッドに置き換えることが可能です。
select(find_all)、reject
selectメソッド(エイリアスメソッドはfind_all)は、各要素に対してブロックを評価し、その戻り値が真の要素を集めた配列を返します。
例として、次のプログラムを実行してみて下さい。
# 3以上の数値を新しい配列に格納する場合
num = [1, 2, 3, 4, 5]
new_num = num.select { |n| n >= 3 }
p new_num
実行結果は以下の通りです。
rejectの場合
rejectはselectの反対で、偽の要素を集めた配列を返します。
例として、次のプログラムを実行してみて下さい。
# 3以上でない数値を新しい配列に格納する場合
num = [1, 2, 3, 4, 5]
new_num = num.reject { |n| n >= 3 }
p new_num
実行結果は以下の通りです。
find(detect)
find(エイリアスメソッドはdetect)は、ブロックの戻り値が真になった最初の要素を返します。
例として、次のプログラムを実行してみて下さい。
# 15で割り切れる数値を新しい配列に格納する場合
num = [10, 20, 30, 40, 50, 60]
new_num = num.find { |n| n % 15 == 0 }
p new_num
実行結果は以下の通りです。
30
inject(reduce)
injectメソッド(エイリアスメソッドはreduce)は、ブロックに配列の「要素1、要素2」、「ブロックの前回の戻り値、要素3」、「ブロックの前回の戻り値、要素4」というように繰り返し処理を行い、メソッドの戻り値はブロックが最後に返した値になります。
例として、配列の合計を求めるプログラムは以下の通りです。
# 配列の要素の合計を求める
num = [10, 20, 30, 40, 50, 60]
new_num = num.inject { |sum, n| sum + n }
p new_num
実行結果は以下の通りです。
210
また、初期値を設定した場合は、ブロックに配列の「初期値、要素1」、「ブロックの前回の戻り値、要素2」、「ブロックの前回の戻り値、要素3」と繰り返し処理を行います。
先ほどのプログラムに初期値を設定してみましょう。初期値に1を設定した場合は以下の通りです。
# 配列の要素の合計を求める
num = [10, 20, 30, 40, 50, 60]
new_num = num.inject(1) { |sum, n| sum + n }
p new_num
実行結果は以下の通りです。
211
少々分かりずらいですが、この動きを理解して使いこなせると色々できそうな感じです。
尚、injectメソッドは数値以外のオブジェクトにも適用できるので覚えておきましょう。
&とシンボル
ブロックを使うメソッドは、以下の条件を満たした場合にかなり簡潔に書くことができます。
- ブロック引数が1個
- ブロック中で呼び出すメソッドに引数がない
- ブロック中では、ブロック引数に対してメソッドを1回呼び出す以外の処理がない
例えば以下のプログラムがあったとします。
# 奇数の場合はtrue、偶数の場合はfalseを新しい配列に格納する場合
num = [1, 2, 3, 4, 5]
num_boolean = num.map { |n| n.odd? }
p num_boolean
次のように書き換えることができます。
# 奇数の場合はtrue、偶数の場合はfalseを新しい配列に格納する場合
num = [1, 2, 3, 4, 5]
num_boolean = num.map(&:odd?)
p num_boolean
このように、条件を満たせば「&:メソッド名」で簡潔に書けるので覚えておきましょう。
まとめ
- 空の配列に他の配列の要素を詰め込むような処理はmapメソッドが使える
- selectメソッドは、各要素に対してブロックを評価し、その戻り値が真の要素を集めた配列を返す
- findメソッドは、ブロックの戻り値が真になった最初の要素を返す
今回紹介したメソッドは使用頻度が高いので、使い方をしっかり覚えましょう!
- 関連記事
Tomoyuki
最新記事 by Tomoyuki (全て見る)
- 【スト6】モダンキャミィの初心者向けコンボまとめ【STREET FIGHTER 6(ストリートファイター6)】 - 2024年11月10日
- モンハンワイルズでおすすめのオプション設定まとめ【Monster Hunter Wilds】 - 2024年11月4日
- モンハンワイルズでおすすめのグラフィック設定まとめ【Monster Hunter Wilds】 - 2024年11月2日
コメントを残す