配列の長さが個数を兼ねているときによく考えるネタ。
環境
$ 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"
という感じで要素とイテレーションする数字を分離して使えるので直感的にかけたりする。