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

f:id:ryoutaku_jo:20190425185626p:plain

【結論】

・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)

each_with_index (Enumerable) - Rubyリファレンス

class Enumerator (Ruby 2.6.0)

《今日の学習進捗(3年以内に10000時間に向けて)》

本日はQiitaの投稿も行なったが、時間が中々確保できない。 仕事と両立させていく事は困難だが、 だからこそ他に真似されにくく、差別化に繋がると信じて、 愚直に続けて行きたい。

学習開始からの期間 :139日
今日までの合計時間:1335h
一日あたりの平均学習時間:9.7h
今日までに到達すべき目標時間:1269h
目標との解離:66h
「10,000時間」まで、

残り・・・「8665時間!」