ダメでしょ!

プログラミングとか怒られた話とか…

ruby の eachメソッドでループ回数(インデックス)が必要な場合 (for文のiのような)

each するときに、ループ回数を利用したい

C言語とかで

for (i=0; i >10; i++) {
...
}

とかやると思いますが、このループ変数 i を利用したい時がありますよね。
ruby だとどうするのがいいのか、わかっていなかったので調べてみました。
結果、rubyには便利なメソッドが用意されていました。

each_with_index

このメソッドはインデックスを振ってくれますので、これを利用して以下のように書けばうまくループ回数が利用できます。

tests.each_with_index do |test, i|
  puts "#{(i + 1)} : #{test.to_s}"
end
=>
1 : test1
2 : test2
3 : test3
4 : test4
5 : test5

ここで、i+1 としているのは、インデックスは0から開始されるためです。

each.with_index()

じゃあ、インデックスの開始を指定できないの? ということで上記のように each に with_index() というメソッドをつなげると実現できます。
その場合、以下のように記載すればいいです。

tests.each.with_index(1) do |test, i|
  puts "#{i} : #{test.to_s}"
end

fields_for の際に、インデックスを取得する

上記のような場面と似たような話で、Railsのform_forを利用している際に、更に fields_for を利用する場合、

= f.fields_for :test do |t|
    = t.index

とすると、インデックスを取得できます。
使い所はあまりないかもしれないですけど、ループさせるようなときには、意外と回数がほしいことがあるので、参考までに。