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)