エラーが出たときに解決に向かうための心構え


エラーが出て、
エラーが出て、
エラーが出てどうしようもなくなったとき、
先輩が問題の箇所を突き止めるまでが鮮やかだったので実際に起きた手順をまとめてエラーに立ち向かう心構えとして残しておきます。

ケーススタディ

こんなコードがあったとします

ruby.qiita.rb
class Menu
  attr_accessor :name
  attr_accessor :price

  def info
    return "#{self.name} #{self.price}円"
  end

  def get_total_price(count)
    total_price = self.price *count
    if count >= 3
      total_price -= 100
    end
    return total_price
  end

end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

puts menu1.get_total_price(3)

1、エラー文をよく読む

上のコードを実行すると、下のエラー文が返ってきます。

〜/user/index.rb:10:in `get_total_praice`:wrong number of arguments (given 1 , expected 0 ) (ArgumentError)
〜/user/index.rb:23:in `<main>`
  • エラーが起きている行の特定
  • エラー内容の把握

ものによっては、親切なエラーが返ってこない場合もありますが上の2点に着目して情報が拾えるとGOODです!

今回はindex.rbファイルの10行目でArgumentErrorが、23行目でも何かエラーが起きていることがわかりました。

2,特定した情報から、仮設を立てて怪しい所を変えてみる

(given 1 , expected 0 ) (ArgumentError)
とありましたので、早速「ArgumentError]について調べてみた所、引数に関わるエラーのようでした。
1与えられているが、0が期待されている。つまり、引数に関わる
- 引数のメソッドの定義
- 引数の呼び出し
どちらかもしくは両方に誤りがあると仮定し、一度引数の表現でない記述に書き直して処理が通るか試してみました。

ruby.qiita.rb
class Menu
  attr_accessor :name
  attr_accessor :price

  def info
    return "#{self.name} #{self.price}円"
  end

  def get_total_price
    count = 3
    total_price = self.price *count
    if count >= 3
      total_price -= 100
    end
    return total_price
  end

end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

puts menu1.get_total_price

3,仮設をもとにエラー文の変化に向き合う

すると、

〜/user/index.rb:11:in `get_total_praice`:wrong number of arguments (given 1 , expected 0 ) (ArgumentError)
〜/user/index.rb:24:in `<main>`

エラーの内容に変化はなく、但しエラーが該当する行数が10→11行、23→24行に変わりました。
該当のコードを抜き出してみると

ruby.qiita.rb
total_price = self.price *count
puts menu1.get_total_price

ここでじっくりと問題の箇所を眺めて、問題を探します。
テキストエディタ上は色付いていて問題なさそうですが、ふと、 * の後ろにスペースがないことに気づきました。
これに気付いて直し試した所、無事正しく処理が通りました。

下記が正しいコードとなります。

ruby.qiita.rb
class Menu
  attr_accessor :name
  attr_accessor :price

  def info
    return "#{self.name} #{self.price}円"
  end

  def get_total_price(count)
    total_price = self.price * count
    if count >= 3
      total_price -= 100
    end
    return total_price
  end

end

menu1 = Menu.new
menu1.name = "ピザ"
menu1.price = 800

puts menu1.get_total_price(3)

まとめ

基本的にエラーメッセージが返ってきた時、初心者にとっては完全に未知の返答である可能性が高いですが、
1,エラーメッセージ1文字1文字にきちんと向き合うこと
2,不足分は仮設を立てて検証を試し、新しいヒントを取りに行く
3,これを解決するまで繰り返す

今後エラーに立ち向かう時、心構えとして共にあらんことを。
(この考え方、姿勢を胸に勉強を続けてまいります。)

今日はこのあたりで失礼します。