Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
配列.each / each_with_index / each_with_object
配列の要素を順番に処理するループメソッドです。単純な繰り返しの『each』から、インデックス付きの『each_with_index』、累積オブジェクトを使う『each_with_object』まで、用途に合わせて使い分けられます。
構文
# 各要素に対してブロックを実行します。
配列.each { |要素| 処理 }
配列.each do |要素|
処理
end
# インデックス付きで繰り返します。
配列.each_with_index { |要素, インデックス| 処理 }
# 累積オブジェクトを持ちながら繰り返します。
配列.each_with_object(初期値) { |要素, オブジェクト| 処理 }
# 逆順に繰り返します。
配列.reverse_each { |要素| 処理 }
メソッド一覧
| メソッド | 概要 |
|---|---|
| each { |e| ... } | 各要素に対してブロックを実行します。戻り値は元の配列です。 |
| each_with_index { |e, i| ... } | 要素とインデックスをブロック変数に渡して繰り返します。 |
| each_with_object(obj) { |e, o| ... } | 初期オブジェクトを保持しながら繰り返します。ハッシュや配列の構築に便利です。 |
| reverse_each { |e| ... } | 配列を逆順に繰り返します。 |
| each_slice(n) { |chunk| ... } | 配列をn個ずつのグループに分けて繰り返します。 |
| each_cons(n) { |chunk| ... } | 配列をn個の連続する要素のグループでスライドしながら繰り返します。 |
サンプルコード
fruits = ['りんご', 'みかん', 'ぶどう', 'もも']
# each:基本のループ
fruits.each { |f| puts f }
# each_with_index:番号付きリスト
fruits.each_with_index do |fruit, i|
puts "#{i + 1}. #{fruit}"
end
# 1. りんご、2. みかん ... と出力されます
# each_with_object:ハッシュの構築
prices = [150, 80, 300, 200]
result = fruits.each_with_object({}) do |fruit, hash|
hash[fruit] = prices[fruits.index(fruit)]
end
puts result.inspect
# {"りんご"=>150, "みかん"=>80, "ぶどう"=>300, "もも"=>200}
# each_slice:3つずつグループ化
(1..9).each_slice(3) { |group| puts group.inspect }
# [1, 2, 3]、[4, 5, 6]、[7, 8, 9] と出力されます
# each_cons:3つの連続要素をスライドしながら処理
(1..5).each_cons(3) { |group| puts group.inspect }
# [1, 2, 3]、[2, 3, 4]、[3, 4, 5] と出力されます
# reverse_each:逆順に処理
[1, 2, 3].reverse_each { |n| print "#{n} " } # 3 2 1
概要
Rubyでは『for』文よりも『each』を使うスタイルが一般的です。『each』はブロックの最後に到達しても『next』で次の繰り返しに進めるなど、Rubyらしいコードが書けます。『each』はブロックの戻り値を捨てて元の配列を返します。変換結果が欲しい場合は『map』を使いましょう。
『each_with_index』は番号付きリストを作る際に便利ですが、開始番号を変えたい場合は『each_with_object』または『map.with_index(1)』の形式が使えます。
『each_with_object』は繰り返しの中でハッシュや配列を構築するときに役立ちます。『inject』(『reduce』)でも同様のことはできますが、ハッシュや配列を累積する場合は『each_with_object』の方が直感的です。ハッシュの each も同様のメソッド構成になっています。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。