【結論】
・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リファレンス
《今日の学習進捗(3年以内に10000時間に向けて)》
本日はQiitaの投稿も行なったが、時間が中々確保できない。 仕事と両立させていく事は困難だが、 だからこそ他に真似されにくく、差別化に繋がると信じて、 愚直に続けて行きたい。
学習開始からの期間 :139日
今日までの合計時間:1335h
一日あたりの平均学習時間:9.7h
今日までに到達すべき目標時間:1269h
目標との解離:66h
「10,000時間」まで、
残り・・・「8665時間!」