Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2006-10-30

配列とeach

配列の要素に先頭から順にアクセスするにはどうしたらいいか。

int a[] = {0, 10, 20, 30};
int i;
for(i = 0;i < 4;i++) {
  int e = a[i]; // 配列の要素にアクセス
}

Ruby にも for 文はある。

a = [0, 10, 20, 30]
for i in [0, 1, 2, 3]
  e = a[i]
end

for の後ろの変数 i には in の後ろで与えられた配列の要素が順番に入ってくる。 が、それならわざわざこんな書き方をしなくても次のように書けばいい。

a = [0, 10, 20, 30]
for e in a
  # e には配列 a の要素が先頭から順に入ってくる
end

変数 i が消えてシンプルになった。変数 i がなくていいならそれに越したことはない。

しかし、実は Ruby では for はあまり使われない( Rails では積極に使われている模様だが)。上のようなコードは each を使って次のように表現することが多い。

a = [0, 10, 20, 30]
a.each do |e|
  # e には配列 a の要素が先頭から順に入ってくる
end

配列の要素すべてを先頭から順に puts メソッドで表示するなら次のように書けばいい。

a = [0, 10, 20, 30]
a.each do |e|
  puts e
end

each do 〜 end の部分には C 言語にはないややこしい話(かつとても興味深い話)があるのだけど、ややこしいので説明は後ほど。 |e| の | がなんなのかとか気になるかも知れないが、do 〜 end の中で使う値を受け取るのにこういう書き方をするという以外に深い意味はないので、もうこの形をまる覚えしてしまうのがいいだろう。

C 言語ユーザーから見れば for の方が自然か。しかし each の書き方は each に限らず他にもいろんなケースで使える形なのだ。