言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. 配列.each / each_with_index / each_with_object

配列.each / each_with_index / each_with_object

対応: Ruby 1.8(2003)

配列の要素を順番に処理するループメソッドです。単純な繰り返しの『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個の連続する要素のグループでスライドしながら繰り返します。

サンプルコード

sample_array_each_each_with_index.rb
members = ['桐生一馬', '真島吾朗', '秋山駿', '錦山彰']

# each:基本のループ
members.each { |m| puts m }

# each_with_index:番号付きリスト
members.each_with_index do |member, i|
  puts "#{i + 1}. #{member}"
end
# 1. 桐生一馬、2. 真島吾朗 ... と出力されます

# each_with_object:ハッシュの構築
powers = [95, 88, 72, 80]
result = members.each_with_object({}) do |member, hash|
  hash[member] = powers[members.index(member)]
end
puts result.inspect
# {"桐生一馬"=>95, "真島吾朗"=>88, "秋山駿"=>72, "錦山彰"=>80}

# 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 array_each_each_with_index.rb
桐生一馬
真島吾朗
秋山駿
錦山彰
1. 桐生一馬
2. 真島吾朗
3. 秋山駿
4. 錦山彰
{"桐生一馬"=>95, "真島吾朗"=>88, "秋山駿"=>72, "錦山彰"=>80}
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
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 も同様のメソッド構成になっています。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。