2013年2月20日水曜日

Rubyのeachの中でインデックス番号を扱う

よくあるネタ。
知らない人(というかチョット前の自分)はこんなふうに書いてるはず。
i = 0
goldsaints.each do |goldsaint|
    # ここは第2の宮 そしておれはカプリコーンのアルデバランだ のようなメッセージを出力する
    p 'ここは第' + (i + 1).to_s + 'の宮 そしておれは' + goldsaint.asterism + 'の' + goldsain.name + 'だ'
    # (エレガントでない)インデックスインクリメント
    i++
end

しかしいつものことだけど、『外側でローカル変数を宣言して中でインクリメントして…』的なやり方は実にださい、しかしeachはベンリなので使いたい、とかいう流れになる。
# javaでも拡張forループはベンリだけどindexが必要になる場合は普通のforループとか使ってた。

で『rubyならそのへん上手くやってくれるんじゃない?』と思い先生に『ruby each index』とか聞いてみたところ、『each_with_index』なるメソッドがあるらしい。

うむ、コレを使えばブロックの変数宣言のところで
|element, i| 的にして中でiが使えるらしい。
となるとさっきのコードは

goldsaints.each_with_index do |goldsaint, i|
    # ここは第2の宮 そしておれはカプリコーンのアルデバランだ のようなメッセージを出力する
    p 'ここは第' + (i + 1).to_s + 'の宮 そしておれは' + goldsaint.asterism + 'の' + goldsain.name + 'だ'
end
となる。
ちょっとエレガントになった、しめしめ。

0 件のコメント:

コメントを投稿