前提・実現したいこと
簡単な自販機プログラムを作成しています。
内容は標準入力で有効な通貨を受け取った場合それを預かり金額に形状し、コーラを受け取った場合釣り銭を計算しコーラを購入したメッセージと釣り銭を出力するものです。
以下がコードです。
vending_machine.rb
ruby
1require './charge.rb' 2 3class VendingMachine 4 attr_reader :charge 5 6 def initialize 7 @charge = Charge.new(0) 8 end 9 10 def accept_order 11 order = gets.chomp 12 handle_order(order) 13 end 14 15 def handle_order(order) 16 if order == 'コーラ' 17 buy_juice 18 elsif Charge.valid_list.include?(order.to_i) 19 charge.add_charge(order.to_i) 20 accept_order 21 else 22 accept_order 23 end 24 end 25 26 def buy_juice 27 formatted_change = charge.amount.to_s 28 p "コーラを購入しました。お釣りは#{formatted_change}円です。" 29 end 30end 31 32VendingMachine.new.accept_order 33
charge.rb
ruby
1class Charge 2 attr_reader :amount 3 4 def initialize(amount) 5 @amount = amount 6 end 7 8 def add_charge(new_charge) 9 p amount.nil? 10 amount += new_charge 11 end 12 13 def change 14 @amount - 120 15 end 16 17 def self.valid_list 18 [10, 50, 100, 500, 1000] 19 end 20end
発生している問題・エラーメッセージ
attr_readerでchargeのゲッターを定義しておりますが、add_chargeで以下のamountがnilであるとエラーが出ます。(この部分をamountではなく@amountにすると正しく動きます。)
しかし、直前でpメソッドでamount.nil?を出力して確認したところfalseとなりnilでないことになっています。
❯ ruby vending_machine2.rb 100 false Traceback (most recent call last): 3: from vending_machine2.rb:32:in `<main>' 2: from vending_machine2.rb:12:in `accept_order' 1: from vending_machine2.rb:19:in `handle_order' /path/to/charge.rb:10:in `add_charge': undefined method `+' for nil:NilClass (NoMethodError)
とても基本的なことを見落としてしまっているかもしれませんが、何卒ご回答のほどよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
rubyのバージョンは2.7.1です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/28 14:49