はじめに
each文が入れ子になると、読みにくいので、どう考えれば良いのか、まとめてみた。
配列の中の配列の中の配列
shopping_price = [["野菜", [200, 250, 220]], ["フルーツ", [1200, 1500]]]
そもそも配列の中に配列がある場合、どのようにして中の値を取り出すのか。
それは、添字を重ねることで、取り出すことができる。
上の配列で1200
を取り出すなら、
puts shopping_price[1][1][0]
となる。
each文
基本的な記述は
配列.each do |ブロックパラメーター(変数)|
#繰り返したい処理
end
ブロックパラメーターはdo~end
の中でのみ扱える変数。イメージとしては、配列の中が一つ一つ入っていく感じ。
配列の名前が複数形の場合、その単数形を入れることが多い。
each文の中にeach文
shopping_price = [["野菜", [200, 250, 220]], ["フルーツ", [1200, 1500]]]
shopping_price.each do |shopping|
sum = 0
shopping[1].each do |price|
sum += price
end
puts "#{shopping[0]}の合計金額は#{sum}"
end
#=>野菜の合計金額は670円
#=>フルーツの合計金額は2700円
外のeach文には、
1回目に["野菜", [200, 250, 220]]
2回目に["フルーツ", [1200, 1500]]
が|shopping|
の中に入る。
中のeach文の配列には、shopping[1]
が当てられている。
つまり、
1回目に[200, 250, 220]
2回目に[1200, 1500]
がprice
の中に入る。
1回目の計算は、
sum = 0 + 200
sum = 200 + 250
sum = 450 + 220
となる。
shopping[0]には、野菜
、フルーツ
がそれぞれ入る。
最後に
[角括弧]がたくさん出てきて、読みにくいが、どの[角括弧]も必要。
each文の中にeach文や配列の中に配列は読みにくいので、リファクタリングが必要だろう。