LoginSignup
0
1

More than 3 years have passed since last update.

ruby each文の入れ子

Posted at

初めに

初学者です。rubyの練習問題を私なりに解説することによって定着するのが目的です。間違いありましたらご指摘お願いします。

問題

以下のように、果物の名前と値段が入った配列があります。
この配列を用いて、果物の名前とそれぞれの合計額が出力される
コードを記述してください。

fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
(出力)
appleの合計金額は670円です
orangeの合計金額は300円です
melonの合計金額は2700円です

まずはeachメソッドのおさらいからしていきます。

eachメソッド

eachとは、配列やハッシュの要素1つ1つに対して要素の数だけ繰り返し処理をすることができるメソッドです。そして繰り返す後にブロック変数の中に配列やハッシュの値が格納されていきます。
書き方としては以下のようになります。

(配列 or ハッシュ).each do |ブロック変数|
#処理
end

またハッシュのようにキーとバリューがある場合、ブロック変数を2つ用意することでキーとバリューの2つの要素を順番に格納することができます。

解説

今回の問題のポイントはeach文を1回書いただけでは全ての値を取り出すことができないことです。金額を取り出すにはeach文を2回使用することが必要になります。
要するに、まずはeach文を使用してappleという配列を取り出し、それからappleの配列の金額を取り出すし順番にプラスしていき金額の合計を出すという流れになります。なのでまずappleを取り出します。

fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
fruits_price.each do |fruit|
end

上記の記述では変数fruitに["apple", [200, 250, 220]]という値が格納されます。
そしてappleからeach文を使い金額を1つずつ取り出してプラスしていきます。そしてその前に、合計値を保存できるように変数を作ります。今回の変数名はsumです。

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
end

fruit[1].each do |price|の文では、変数fruitの1番目の値を一つずつ取り出しています。そして最後に出力する記述を書けば終了です。

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

そしてappleの値を全て返した後に次のorengeが同じように繰り返されます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1