質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

984閲覧

byebugでデバッグをしていたらNameError Exception: undefined local variable or methodのエラーが表示されたが理由がわかりません。

MasakiSakamoto

総合スコア13

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/09/28 00:07

byebugを使って順にデバッグを実行していたら、__NameError Exception: undefined local variable or method `drink' for VendingMachine:Class__と表示されたが原因となる部分が見当たらず自己解決に至りませんでした。
エラーの原因を説明していただきたいです。

表示されたエラーのスクショになります。
イメージ説明

下記がvending_machine.rbのコードになります。

Ruby

1require './drink' 2 3class VendingMachine 4 require 'byebug'; byebug 5 USEABLE_MONEY = [10, 50, 100, 500, 1000] 6 attr_reader :total, :sale_amount 7 8 #初期化 9 def initialize 10 @total = 0 11 @sale_amount = 0 12 @drink_table = {} 13 #ドリンククラスを作成したら5本格納の文を書く 14 5.times { store Drink.coke } 15 end 16 17 #投入金額 18 def insert(money) 19 USEABLE_MONEY.include?(money) ? nil.tap { @total += money } : money 20 end 21 22 #お釣り 23 def change 24 total.tap { @total = 0} 25 end 26 27 def store(drink) 28 nil.tap do 29 @drink_table[drink.name] = { price: drink.price, drinks: [] } unless @drink_table.has_key? drink.name 30 @drink_table[drink.name][:drinks] << drink 31 end 32 end 33 34 def purchase(drink_name) 35 if purchaseable? drink_name 36 drink = @drink_table[drink_name][:drinks].pop 37 @sale_amount += drink.price 38 @total -= drink.price 39 [drink,change] 40 end 41 end 42 43 def purchaseable?(drink_name) 44 purchaseable_drink_names.include? drink_name 45 end 46 47 def purchaseable_drink_names 48 @drink_table.select{|_, info| info[:price] <= total && info[:drinks].any? }.keys 49 end 50 51 def stock_info 52 Hash[@drink_table.map {|name, info| [name, { price: info[:price], stock: info[:drinks].size }] }] 53 end 54 55end

drink.rbのコード↓

Ruby

1class Drink 2 attr_reader :name, :price 3 4 def self.coke 5 self.new 120, :coke 6 end 7 8 def self.redbull 9 self.new 200, :redbull 10 end 11 12 def self.water 13 self.new 100, :water 14 end 15 16 def initialize price, name 17 #インスタンス変数 18 @name = name 19 @price = price 20 end 21 22 def ==(another) 23 self.name == another.name 24 end 25 26 def eql?(another) 27 self == another 28 end 29 30 def hash 31 name.hash 32 end 33 34 def to_s 35 "<Drink: name=#{name}, price=#{price}>" 36 end 37end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2018/09/28 01:09

p drinkの結果が"undefined local variable or method"という事でよいのでしょうか?
MasakiSakamoto

2018/09/28 01:12

はい、そうです。"*** NameError Exception: undefined local variable or method `drink' for VendingMachine:Class"が返されます。
guest

回答1

0

ベストアンサー

34行目の時点ではdrinkは存在しないので参照できません。

ブレークポイントを設置する位置を変更してください。


追記
byebugの使い方を理解してないようなので
vending_machine.rb内のrequire 'byebug'; byebugをコメントアウトした状態で
まず、VendingMachineを扱うコードを書きます。

rb

1require './vending_machine' 2require 'byebug'; byebug 3vm = VendingMachine.new 4vm.insert 500 5vm.purchase :coke

実行すると止まるので

b VendingMachine#purchase

でブレークポイントを設置します。
cで続きを実行させます。
止まったらnでステップ実行するなり、b 37で再度ブレークポイントを設定してcするなりして
任意の時点まで進めます。その後にp drinkなどで変数を調べる事が可能です。

投稿2018/09/28 01:18

編集2018/09/28 08:15
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasakiSakamoto

2018/09/28 01:26

ブレークポイントの位置を変えて試しましたが、同等の"NameError Exception: undefined local variable or method `drink' for VendingMachine:Class"が返ってきました。 ご参考までに下記にリポジトリのurlを貼っておきます。上記のコードだと見づらい等あればこちらからご覧いただければと思います。 https://github.com/MasakiSakamoto/it-assignment01
asm

2018/09/28 01:31

purchaseメソッド内のdrink変数を参照したい場合は37行目(drink = の次行)以降にブレークポイントを設置する必要があります。
MasakiSakamoto

2018/09/28 02:09

ご指摘通り37行目以降にブレークポイントを張りましたが全く同じエラーが返ってきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問