コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rubyでeach.with_indexを使うと n+1みたいなことをしなくてもいい感じに1からはじまる値が取得ができる

配列の長さが個数を兼ねているときによく考えるネタ。

環境

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18]

実例

要件

配列に画像のファイル名が入っているので No.1:添字0の画像名No2:添字1の画像名 というように表示したい

対象となる配列は以下

file_names = ["pictureA.jpg","pictureB.jpg","example.gif"]

愚直なやり方

each_with_indeで回す

file_names.each_with_index { |name, index| p "No.#{index+1}:#{name}" }
"No.1:pictureA.jpg"
"No.2:pictureB.jpg"
"No.3:example.gif"

ただしこうすると index + 1 という感じで0から始まるという制約での計算となりもにゃっとする。

eachのwith_indexを使う考え方

eachのメソッドに with_index というのがある

生成時のパラメータに従って、要素にインデックスを添えて繰り返します。 インデックスは offset から始まります。 - instance method Enumerator#with_index (Ruby 2.6.0)

eachでアイテムをセットしつつ、オフセット数値から始まるインデックスを渡す。

file_names.each.with_index(1) { |name, index| p "No.#{index}:#{name}" }
"No.1:pictureA.jpg"
"No.2:pictureB.jpg"
"No.3:example.gif"

という感じで要素とイテレーションする数字を分離して使えるので直感的にかけたりする。

参考リンク