はじめに
本項ではeach.with_indexについて解説
概要
要素にインデックスを添えて繰り返すメソッド。
要素自体に順番を示すインデックスを属性として設定していないが、処理として要素の順番を示したい場合に使用する。
使用方法
Objs.each.with_index(offset){|obj,index| 〜繰り返す処理〜 }
# Objs => 繰り返す対象の配列。
# offset => 開始するインデックス番号。
# obj => 繰り返し処理中の要素の変数名。
# index => 繰り返し処理中のインデックスの変数名。
備考
- offsetを与えない場合、indexは0から始まります。
使用例(offsetなし)
animals = ["cat","dog","mouse"]
animals.each.with_index {|animal,i|
puts "#{i}番目は#{animal}です。"
}
出力結果は以下
0番目はcatです
1番目はdogです
2番目はmouseです
使用例(offsetあり)
人間の感覚で0から始まると気持ちが悪いのでoffsetに1を与えると良いと思います。
animals = ["cat","dog","mouse"]
animals.each.with_index(1) {|animal,i|
puts "#{i}番目は#{animal}です。"
}
出力結果は以下
1番目はcatです
2番目はdogです
3番目はmouseです
参考記事
※修正(2018/3/31)
each_with_index (Enumerable) - Rubyリファレンス
上記のリンクはeach_with_indexのものでした。失礼しました。ご指摘ありがとうございます。
またご指摘いただいたscivolaさんの両メソッドの解説がわかりやすい為、引用させていただきます。
(前略)each.with_index と each_with_index は見た目は似ていますが,別物なんですよね。
each_with_index は Enumerable モジュールのメソッドです。オフセットを与えることはできません。
一方,each.with_index のほうは,ブロック無しの each が Enumerator オブジェクトを返し,それの with_index メソッドを呼んでいます。
Enumerator はちょっと抽象的で分かりにくいものですが,それの理解が鍵ですね。
内容のみならず、レイアウトや書き方にアドバイスがある方はお気軽に(優しく)コメントを頂けると助かります。