対象:
CRuby
JRuby

配列、ハッシュに対する繰り返し(イテレータ)

配列やのハッシュの各要素に対する繰り返し処理ではイテレータを利用する場面が多いだろう。実際、Rubyでスクリプトを書いていても、通常のeachメソッドに加えてeach_with_indexメソッドも利用できるので、forを使う事はあまりなくなる。もっとも、各人の書き方や趣味にもよるであろうが。

forやwhile等の書き方はこちらを参照していただきたい。

  1. each
  2. each_with_index

each

配列やハッシュの各要素に対する繰り返し処理は、イテレータを使うと簡単に書ける。具体的には配列やハッシュに対してeachメソッドと繰り返し処理のブロックを使う。次の例では1~10までの要素を持つ配列aの、すべての要素の合計を求める処理である。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sum = 0
a.each do |n|
  sum += n
end
p sum
55

配列aの各要素は、ブロックにnとして渡され、その中でnを用いて何らかの処理を書く。上記の例ではブロックが実行される度にsumにnを加算している。

また、[]を使って処理対象の要素を限定することもできる。例えば処理対象を0番目からではなく1番目から処理したいとか、3番目までを処理したい等である。最後の要素は-1で表せる。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sum = 0
# 5番目の要素から最後の要素までを処理
a[5..-1].each do |n|
  sum += n
end
p sum
40

ハッシュの場合、イテレータを使うとブロックでkeyとvalueの両方を得られるので、それを使った処理を記述できる。

h = {'a' => 10, 'b' => 20, 'c' => 30}
h.each do |key, value|
  print "#{key}の値は#{value}です。\n"
end
aの値は10です。
bの値は20です。
cの値は30です。

each_with_index

each_with_indexメソッドを使うと、ブロックの中で配列の要素に加えてインデックスも得られるので、他の配列等と連動した処理を行う場合に便利である。インデックスは0から始まる。

a = ["apple", "orange", "banana"]
a.each_with_index do |n, i|
  print "#{n}は#{i}番目の要素です\n"
end
appleは0番目の要素です
orangeは1番目の要素です
bananaは2番目の要素です

each_with_indexはハッシュに対してももちろん使える。が、1つだけ重要なポイントがある。

h = {'a' => 10, 'b' => 20, 'c' => 30}
h.each_with_index do |(key, value), i|
  print "#{i}回目の処理: #{key}の値は#{value}です。\n"
end

それはハッシュの場合、上記のようにkey, valueのペアは()で括ってやる必要がある。

0回目の処理: aの値は10です。
1回目の処理: bの値は20です。
2回目の処理: cの値は30です。
(2010/04/08)

新着情報
【iOS Objective-C, Swift Tips】画像の向きを指定して保存する(Swift)
【iOS Objective-C, Swift Tips】UIImagePickerControllerの表示を日本語にする(Swift)
【iOS Objective-C, Swift Tips】ウィンドウの階層構造を3D表示する(Swift)

Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved.
[Home]