皆様こんにちは、プレイライフの熊崎です!
本日2本目の記事はwith_indexメソッドについて書こうと思います。
with_indexメソッドとは
生成時のパラメータに従って、要素にインデックスを添えて繰り返します。インデックスは offset から始まります。
ブロックを指定した場合の戻り値は生成時に指定したレシーバ自身です。
参考URL: https://docs.ruby-lang.org/ja/latest/method/Enumerator/i/with_index.html
どのようなタイミングで使用するのか?
→ 繰り返し処理の最中に、index(添字)を使用したいとき
具体例
あるイベントの開催候補日の配列を、第一希望: 2021年9月5日
のように、添字も含めた文字列を表示したいとき
sample.rb
candidate_dates = ['2021年9月5日', '2021年9月6日', '2021年9月7日']
candidate_dates.each.with_index(1) do |date, index|
p "第#{index}希望:#{date}"
end
#=> "第1希望:2021年9月5日"
# "第2希望:2021年9月6日"
# "第3希望:2021年9月7日"
特徴
- 開始番号を指定できるため、直感的にわかりやすいコードをかける。
- mapメソッドやselectメソッドなどにも使用できる。
開始番号を指定できるため、直感的にわかりやすいコードをかける。
sample.rb
# each_with_indexを使用した書き方
fruits.each_with_index do |fruit, index|
p "私が#{index + 1}番目に好きな果物は#{fruit}です。" # 開始番号を指定できないため、 index + 1と書く必要がある。
end
#=> "私が1番目に好きな果物はリンゴです。"
# "私が2番目に好きな果物はオレンジです。"
# "私が3番目に好きな果物はバナナです。"
# each.with_indexを使用した書き方
fruits.each.with_index(1) do |fruit, index| # 開始番号を指定できるので、こちらの方が直感的にわかりやすい
p "私が#{index}番目に好きな果物は#{fruit}です。"
end
#=> "私が1番目に好きな果物はリンゴです。"
# "私が2番目に好きな果物はオレンジです。"
# "私が3番目に好きな果物はバナナです。"
mapメソッドやselectメソッドなどと組み合わせて使用できる。
with_indexメソッドはEnumeratorクラスのメソッドのため、Enumeratorオブジェクトを返すmapメソッドやselectメソッドなどと組み合わせて使用することができる。
sample.rb
candidate_dates = ['2021年9月5日', '2021年9月6日', '2021年9月7日']
candidate_dates.map.with_index(1) do |date, index|
"第#{index}希望:#{date}"
end
#=> ["第1希望:2021年9月5日", "第2希望:2021年9月6日", "第3希望:2021年9月7日"]
まとめ
- mapメソッドやselectメソッドにもindexを振れる。
- each_with_indexと違って、開始番号を指定できる。
- 繰り返し処理の中で添字を使用したい場合に使われる。