with_indexによる繰り返し処理のカウント

【結論】

・with_indexとは、
 eachやmapなどで繰り返しの処理をした際、
 現時点の繰り返し回数をカウントしてくれる。

・引数を指定する事で、
 カウント開始時点の数を任意で決められる

・eachの場合、each_with_indexという
 with_indexメソッドの機能が
 あらかじめ備わったメソッドも存在する

【目次】

【本題】

繰り返し処理のカウント

eachなどの繰り返し文を実行する際、
処理結果に、何回目の処理だったのかを出力したいケースがあります。

例えば、配列に格納した数字を順に出力して、
それが何番目なのか?を表示させたい場合です。

一例として、下記のように実装することも出来ます。

count = 1
[6, 12, 18].each do |num|
puts "#{num}は、#{count}番目です"
count += 1
end

=>
6は、1番目です
12は、2番目です
18は、3番目です

しかし、これでは回数を数える為の
変数「count」を定義して、繰り返す度に
その変数を+1する必要があります。

こういった処理が不要になるのが、「with_index」です

with_indexについて

with_indexとは、eachなどの繰り返し文の
処理回数を記録するインデックスを生成します。

[6, 12, 18].each.with_index do |num, i|
puts "#{num}は、#{i}番目です"
end

=>
6は、0番目です
12は、1番目です
18は、2番目です

このようにする事で、わざわざ処理回数を記録する為の
変数を定義せずとも、処理回数を参照することが出来ます。

しかし、上記の場合だと、カウントが「0」から始まっています。
もし、任意の数からカウントを始めたい場合は、
with_indexの引数に指定する必要があります。

[6, 12, 18].each.with_index(1) do |num, i|
puts "#{num}は、#{i}番目です"
end
=>
6は、1番目です
12は、2番目です
18は、3番目です

これで任意の数からカウントが可能になります。

each以外でも利用可能

なお、with_indexはEnumeratorクラスのメソッドなので、
each以外にも、mapやselectでも利用可能です。

[6, 12, 18].map.with_index(1) { |num, i| "#{num}は、#{i}番目です" }
=> ["6は、1番目です", "12は、2番目です", "18は、3番目です"]

each_with_indexについて

なお、eachの場合だと、あらかじめwith_indexの機能が備わった
each_with_indexというメソッドも存在します。

[6, 12, 18].each_with_index do |num, i|
puts "#{num}は、#{i}番目です"
end

=>
6は、0番目です
12は、1番目です
18は、2番目です

しかし、こちらはカウント開始時点の数を
指定できないという欠点があります。

参考情報

instance method Enumerator#with_index (Ruby 2.1.0)

https://ref.xaio.jp/ruby/classes/enumerable/each_with_index

class Enumerator (Ruby 3.2 リファレンスマニュアル)