勉強会の状況
・100人以上のプログラミング学習コミュニティで勉強会開催。
・初学者の方向け
・集まったのは5~8人
デバックとは
デバックとはプログラムにエラーや異常がないかを確認し、修正することです。
実務ではデバックをしながらプログラムを書いたり、エラーの原因を特定する時に
使います。実務をやる上で必須みたいです。
プログラミング以外でもゲームが完成した後に、想定通りに動くかを
検証したりする仕事があります。デバッカーという仕事です。
このデバッカーがいないと、誤った動作をしたままゲームがリリースされてしまいます。
上でも紹介したようにデバックをしないとクライアントにも迷惑をかけてしまう
リスクが出てきます。
プログラマーが開発をする上でデバックをしながら開発していくので必須のスキルとなるので
初学者の段階から毎日の学習でデバックを使い慣らしていく必要があります。
binding.pryとは
このbinding.pryがデバックで使うコマンドです。
必須なので抑えておきましょう。
デバックの導入
以下のコマンドでインストールします。
gem install pry-byebug
binding.pryの使い方
binding.pryにはプログラムの処理を止める機能があります。
処理を止めながらエラーなどを確認していきます。
⚫︎補足
pryとは
pryとはrailsコンソールみたいに、メソッドなどを調べたり、
使えるようにするものです。
binding.pryの使い方を説明していきます。
例えば下のような家族の平均年齢を計算するとします。
father_age = 50
mother_age = 40
son_age = 20
daughter_age = 10
average_age = (fathe_age + mother_age + son_age + daughter_age) /5
puts average_age
このまま実行するとエラーが出ます。
Traceback (most recent call last):
practice.rb:4:in `<main>': undefined local variable or method `fathe_age' for main:Object (NameError)
Did you mean? father_age
これは4行目の名前が定義されていないというエラーです。原因は何でしょうか。
ここでbinding.pryを使って特定していけます。
⚫︎補足
わかる方も多いと思いますが初学者向けに書いてあります。
まずbinding.pryの使い方です。
require "pry" #この記述をします(railsでは不要です。)
father_age = 50
mother_age = 40
son_age = 20
daughter_age = 10
binding.pry #止めたい場所
average_age = (fathe_age + mother_age + son_age + daughter_age) /5
binding.pry #止めたい場所
puts average_age
binding.pryはプログラムの処理を止めたい場所に追記しましょう。
require "pry"はRubyの時に使い、railsを使う時は不要です。
プログラムを実行すると下のような表示になります。
From: /Users/taro/Desktop/ruby/practice.rb:58 :
53: father_age = 50
54: mother_age = 40
55: son_age = 20
56: daughter_age = 10
57: binding.pry
=> 58: average_age = (fathe_age + mother_age + son_age + daughter_age) /5
59: binding.pry
60: puts average_age
=> 58: average_age でプログラムの処理が止まっています。
処理がaverage_ageで止まったので上は特に問題がない
ということになります。
binding.pryを入れる場所はエラーが出ている場所の1行上に入れます。
処理が止まった場合はそのbinding.pryより上は問題なく
止まらなかった場合はその上に問題があるということになります。
binding.pryでエラーが起きている場所を特定していくことができます。
⚫︎補足
53や58はたまたま53,58行目にコードを書いてあるだけです。
[1] pry(main)> son_age
=> 20
son_ageと入力すると、20と返って来るのでson_ageに問題はないとわかります。
他の〇〇ageは問題ないとわかリました。(今回は割愛。son_ageとやり方は同じです。)
5] pry(main)> average_age = (fathe_age + mother_age + son_age + daughter_age) /5
NameError: undefined local variable or method `fathe_age' for main:Object
Did you mean? father_age
from (pry):5:in `<main>'
average_age = (fathe_age + mother_age + son_age + daughter_age) /5 を
入力するとエラーが発生しました。ここでエラーの原因はここだとわかりました。
エラーの内容を翻訳すると
father_ageという意味ですか。```
となります。father_ageがfathe_ageとなっていたのが間違えでした。
以下のように修正してプログラムを実行します。
```practice.rb
father_age = 50
mother_age = 40
son_age = 20
daughter_age = 10
average_age = (father_age + mother_age + son_age + daughter_age) /5
puts average_age
そしてプログラムを実行すると、
24
これで正しく出力されました。
このような流れでbinding.pryを使いエラーを特定していきます。
処理が止まらない場合も見てみましょう。
複数のbinding.pryを使います。
require "pry"
father_age = 50
mother_age = 40
son_age = 20
daughter_age = 10
binding.pry #1回目
average_age = (father_age + mother_age + son_age + daughter_age) /5
binding.pry #2回目
sum_age = father_age + mother_age + son_age + daughter_age
binding.pry #3回目
puts average_ag
binding.pry #4回目
puts sum_age
これでプログラムを実行していきます。
1] pry(main)> continue #1回目のbinding.pry
1つ目のbinding.pryは処理が止まっています。この上は問題ないことがわかります。
2,3,と問題なく処理が実行できcontinueを使います。
⚫︎補足
continueはデバックでのプログラムの実行コマンドです。
コマンドについて詳細は下にあります。
4回目のbinding.pryのところに来ると、
[1] pry(main)> continue
Traceback (most recent call last):
each_sample.rb:62:in `<main>': undefined local variable or method `average_ag' for main:Object (NameError)
Did you mean? average_age
エラーが発生。回目までは問題なく処理が止まっていたので
4回目の上で3回目の下がエラーの箇所と特定できます。
エラーから読み取ると、average_ageのスペルミスです。average_agになっていたのが原因です。
修正しプログラムを実行すると、
[1] pry(main)> continue
120
と出力されました。
これで正しい挙動になったということです。
binding.pryを使うもう一つのメリット
binding.pryを入れることによりプログラムの流れを
確認することもできます。初学者の段階ならどのように
プログラムが処理をされているのかを知る機会になるので
普段の学習から使ってみてください。
binding.pryで使うコマンド
binding.pryでは以下のコマンドを使います。
他のコマンドは知らないのでご自身で調べてください。
next 次の行へ移動
step次の行かメソッド内に入る
continue プログラムの実行
finish 現在のフレームが終わるまで実行
exit! 強制終了
特にcontinueが1番使いました。
⚫︎参考資料
https://qiita.com/AknYk416/items/6f0bec58712edaf4940e
https://pikawaka.com/rails/pry