またサボり気味だったアウトプットの練習。
でも3日坊主を何回も続けていれば完全にサボったことにはならない(言い訳)
問題
配列の中にある果物の名前と値段の合計金額を出力しろという問題。
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
(出力)
appleの合計金額は670円です
orangeの合計金額は300円です
melonの合計金額は2700円です
自分の回答
practise.rb
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
fruits_price.each do |item, price|
puts "#{item}の合計金額は#{price.sum}円です"
end
自分は配列内の全要素の合計を出すためにsumメソッドを使用してみた。
example.rb
puts [1, 2, 3].sum #=> 6
eachメソッドは配列やハッシュの要素の数だけ繰り返し処理を行えて、その繰り返し処理が実行されるたびに配列やハッシュの値がブロック変数に格納されてその値を処理の中で使えるというものでした。
模範回答
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
fruits_price.each do |fruit|
sum = 0
fruit[1].each do |price|
sum += price
end
puts "#{fruit[0]}の合計金額は#{sum}円です"
end
こちらの場合は最初にfruits_priceから["apple", [200, 250, 220]
という値を取り出してブロック変数fruitsに代入、その後1番目の値["apple", [200, 250, 220]
から値を1ずつ取り出して自己代入しながらsumを出力する。以下のような動きになる。
# 1回目
sum = 0
#sum += priceはsum = sum + priceと解釈できる
sum = 0 + 200
# 返り値
sum = 200
#2回目
#sumは1回目の200という値が返されます
sum = 200
sum = 200+ 250
sum = 450
#3回目
#sumは2回目の450という値が返されます
sum = 450
sum = 450+ 220
sum = 670
これでappleの合計金額は670円ですと出力される。この作業を残り2つorange、melonでも繰り返すというものでした。
結果として出力結果はどちらとも一緒だが、とにかく書いていろんな書き方を学んでこうと思う。