#目的
カロリー計算のプログラム実装を通じ、クラスとインスタンスについての理解を深める。
#ターミナル上での表示の流れ
1,記録か参照かを選択
[0]カロリーを入力する
[1]カロリーの合計を確認する
2,[0]を選択した場合 (カロリー入力画面)
料理名を入力してください:
おにぎり
カロリーを入力してください:
120
3,[1]を選択した場合 (カロリー合計表示画面)
-----------------------------
おにぎり:120kcal
スパゲティ :720kcal
バナナ :80kcal
-----------------------------
カロリー合計 :920kcal
#実装の流れ
###1、まずは定義していくためのクラスの用意と、定義したクラスのメソッドを呼び出す処理の記述を行う
class Food
#これからメソッドの定義を行っていく場所
end
while true do #while文で繰り返し処理を行う。trueの部分は条件式も入る。trueにすることで条件式が全部真になり処理が無限ループする
puts "[0]:カロリーを入力する"
puts "[1]:カロリーの合計を確認する"
input = gets.to_i
if input == 0
Food.input # カロリーを入力するためのメソッドを呼び出す。
elsif input == 1
Food.show_all_calory # カロリーの合計を表示するためのメソッドを呼び出す。
exit
end
end
呼び出しにクラスメソッドを使用。クラスメソッドとインスタンスメソッドの使い分けについては以下を参照しました。今回のようにデータを直で入力するようなケースならクラスメソッドでいいと思う。
※参照 https://blog.mah-lab.com/2014/11/13/instance-method-and-class-method-with-ruby/
###2、箱の用意
class Food
@@food = []
end
データは配列に格納。
クラス変数にしてますが、@food = [] のようにクラスインスタンス変数にしても、今後配列を使っていく場所がクラスメソッドの中なので動作に問題はありません。
インスタンス変数、クラス変数、クラスインスタンス変数の定義については以下の記事がめちゃ参考になりました。
※参照 https://qiita.com/mogulla3/items/cd4d6e188c34c6819709
###3,食品名とそのカロリーを記録するための記述を行う
def self.input
puts "料理名を入力してください"
name = gets.chomp
puts "カロリーを入力してください"
calory = gets.to_i
food = Food.new(name,calory) #initializeメソッドを呼び出し、インスタンスfoodがもつデータを定義。
@@foods << food #配列オブジェクト@@foodsにインスタンスfoodを追加。@@foodsはクラス変数のため、処理を行うごとにデータが上書きされていく。
end
def initialize(name, calory)
@name = name
@calory = calory
end
###4,カロリー参照用のメソッドを記述していく
def self.show_all_calory
all_calory = 0
puts "-----------------------------"
@@foods.each do |food| #each文で繰り返し処理。変数foodのなかに配列@@foodsのデータを全て代入していく。
puts"#{food.name} : #{food.calory}kcal"
all_calory = all_calory + food.calory
end
puts "-----------------------------"
puts "カロリー合計 :#{all_calory}kcal"
end
ほとんど完成だが、このままでは__puts"#{food.name} : #{food.calory}kcal"__のとこでundifined methodとエラーが出てしまうため、
def name # @nameを取得するためのインスタンスメソッド
return @name
end
def calory
return @calory # @caloryを取得するためのインスタンスメソッド
end
のように、@nameと@caloryを__メソッド__として定義することで配列のデータが代入された変数から値を取り出せるようにする。
#完成!
class Food
@@foods = []
def self.input
puts "料理名を入力してください"
name = gets.chomp
puts "カロリーを入力してください"
calory = gets.to_i
food = Food.new(name,calory)
@@foods << food
end
def initialize(name, calory)
@name = name
@calory = calory
end
def self.show_all_calory
all_calory = 0
puts "-----------------------------"
@@foods.each do |food|
puts"#{food.name} : #{food.calory}kcal"
all_calory = all_calory + food.calory
end
puts "-----------------------------"
puts "カロリー合計 :#{all_calory}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