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
こんなこともできるんだ…。