Rubyの勉強会で使用した資料(Rubyでのデバックbinding.pryの使い方)

#勉強会の状況
・***１００人以上のプログラミング学習コミュニティ***で勉強会開催。
・***初学者の方向け***
・集まったのは***5~8人***



#デバックとは
***デバックとはプログラムにエラーや異常がないかを確認し、修正する***ことです。
***実務ではデバックをしながらプログラムを書いたり、エラーの原因を特定する時に
使います。実務をやる上で必須みたいです。***


プログラミング以外でもゲームが完成した後に、想定通りに動くかを
検証したりする仕事があります。デバッカーという仕事です。
このデバッカーがいないと、誤った動作をしたままゲームがリリースされてしまいます。

上でも紹介したようにデバックをしないとクライアントにも迷惑をかけてしまう
リスクが出てきます。
プログラマーが開発をする上でデバックをしながら開発していくので必須のスキルとなるので
```初学者の段階から毎日の学習でデバックを使い慣らしていく必要があります。```

#binding.pryとは
この***binding.pry***がデバックで使うコマンドです。
必須なので抑えておきましょう。

#デバックの導入
以下のコマンドでインストールします。

```
gem install pry-byebug
```
#binding.pryの使い方
***binding.pryにはプログラムの処理を止める機能があります。***
処理を止めながらエラーなどを確認していきます。

⚫︎補足
pryとは
pryとはrailsコンソールみたいに、メソッドなどを調べたり、
使えるようにするものです。

binding.pryの使い方を説明していきます。
例えば下のような家族の平均年齢を計算するとします。

```practice.rb

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

```
これは４行目の名前が定義されていないというエラーです。原因は何でしょうか。
ここでbinding.pryを使って特定していけます。
　　
⚫︎補足
わかる方も多いと思いますが初学者向けに書いてあります。

まず***binding.pryの使い方***です。

```practice.rb
  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を入れる場所はエラーが出ている場所の１行上に入れます。```
***処理が止まった場合はその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*** を
入力すると***エラーが発生***しました。ここで***エラーの原因はここ***だとわかりました。
エラーの内容を翻訳すると
```名前のエラーです。fathe_ageというメソッドはオブジェクトで定義されていません。
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を使います。***

```practice.rb

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　　#２回目
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はデバックでのプログラムの実行コマンドです。
コマンドについて詳細は下にあります。

４回目の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回目の上で３回目の下がエラーの箇所と特定できます。***
エラーから読み取ると、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