each ってこんな使い方もできたんだ…知らなかった

[
  [1, 11, 111],
  [2, 22, 222],
  [3, 33, 333],
].each{|a, b, c| puts "#{a} #{b} #{c}"}

これを実行すると

1 11 111
2 22 222
3 33 333

こうなる。


基本ですか?
そうかもしれません…(´・ω・`)


ちなみに今までの僕だったらこうしていたと思う。

[
  [1, 11, 111],
  [2, 22, 222],
  [3, 33, 333],
].each{|a| puts "#{a[0]} #{a[1]} #{a[2]}"}


んー。この配列だと a[0] とか使った方が読みやすいな。
だから実際には、zip した後とか意味のある名前をつけたいときに使うのがよさそう。

names = ["taro", "hanako", "monta"]
ages = [19, 20, 18]
genders = ["male", "female", "male"]
names.zip(ages, genders).each{|name, age, gender| puts "#{name} #{age} #{gender}"}
taro 19 male
hanako 20 female
monta 18 male

う…この例もあんまりよくない…かも。
僕には即興でいい例をつくる柔軟性がないらしい。

この例で大丈夫みたい。

追記

id:rubikitch さんからトラックバックをもらった。
ブロック引数は多重代入と同じルール、カッコもつけられる - ’(rubikitch wanna be (a . lisper))

ブロック引数は多重代入のルールが適用される。
配列の要素に名前をつけたい場合、

a = ary[0]
b = ary[1]
c = ary[2]

ではなくて

a, b, c = ary

と書きたいでしょう?それと同じ。

おーそうなのかー。なるほど。
これできっと記憶に残る!
ありがとうございます。

さらに、多重代入もブロック引数も()をつけることができる。

x, (y, z) = [7, [8,9]]
x                               # => 7
y                               # => 8
z                               # => 9
[ [1, [2,3]],
  [4, [5,6]]].each do |a,(b,c)|
  puts "#{a} #{b} #{c}"
end
# >> 1 2 3
# >> 4 5 6

こんなこともできるんだ…。