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