ずみーBlog

元クラゲ研究者(見習い)の92年生まれがエンジニアを目指しながら日々寄り道するブログです。

【オブジェクト指向】インスタンス変数の使い方がちょっとだけわかった話

結論

配列のクラス変数を用意してnewする時にインスタンスを必ず配列に追加するようにしておけば、後から集計に使えるってことに気付きました。

今回の例

Foodクラスに@@foods = []という配列型のクラス変数を持っておき、12行目のinputメソッドでインスタンス生成するたびに@@foodsインスタンスを追加しておきます。

すると、クラスメソッドのshow_all_calory(20行目)でいとも簡単に今まで生成したインスタンスを繰り返し処理したり、カロリー合計が計算できてしまいます。

このように、newするたびにクラス変数の配列にインスタンスごと格納しておくことによって、あとでインスタンスたちをまとめて処理したい時に役立つのでした。

class Food
  # ここにクラスの定義を書き加えてください
  attr_reader :name, :calory

  @@foods = []
  @@line = "-----------------------------"

  def initialize(name, calory)
    @name, @calory = name, calory
  end

  def self.input
    puts "料理名を入力してください"
    name = gets.chomp
    puts "カロリーを入力してください"
    calory = gets.to_i
    @@foods << self.new(name, calory)
  end

  def self.show_all_calory
    puts @@line
    total = 0
    @@foods.each do |food|
      puts "#{food.name}   :#{food.calory}kcal"
      total += food.calory
    end
    puts @@line
    puts "カロリー合計   :#{total}kcal"
  end
end

while true do
  puts "[0]:カロリーを入力する"
  puts "[1]:カロリーの合計を見る"
  input = gets.to_i

  if input == 0
    Food.input           # カロリーの入力
  elsif input == 1
    Food.show_all_calory # カロリーの合計を表示
    exit
  end
end