PRY×EXACTLY(Ruby3.2 のbinding.irbを試す)

「あけましておめでとうございます。ことしもよろろすおねがいするます」
って感じで昨年放送された某スパイアニメ風な形でスタートさせていただきました。

今年も記事投稿していこうと思いますのでよろしくお願いいたします！

# はじめ

去年の12月に恒例のRuby新バージョンのリリースがされました :tada:

https://www.ruby-lang.org/ja/news/2022/12/25/ruby-3-2-0-released/

今年はそれらの機能について実際に動かしたりして所感を書こうと思います！

今回紹介する Ruby 3.2の内容は `irb` (`binding.irb`) です

Ruby, Railの開発をしているとき私はずっと `binding.pry` を使い続けてきました。
そんな中 Ruby 3.2　で `binding.irb` が進化したと聞きました。それを聞いて

「わくわくっ!!」

したのでRuby3.2の `binding.irb` 使ってみようと思います

# Ruby 3.2のインストールについて

今回Ruby3.2の機能紹介する記事としては1発目なのでインストールについて少々

```
$ rbenv install 3.2.0 
```

mac(homebrewを使用して)にてインストールしようとした際、いつもと同じように新しいバージョンをインストールを実行したらエラーが発生し、インストールが失敗しました


```shell
Last 10 log lines:
	Check ext/psych/mkmf.log for more details.
*** Fix the problems, then remove these directories and try again if you want.
Generating RDoc documentation
/private/var/folders/zn/xxxxxx/T/ruby-build.xxxxxxxx/ruby-3.2.0/lib/yaml.rb:3: warning: It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
uh-oh! RDoc had a problem:
cannot load such file -- psych

run with --debug for full backtrace
make: *** [rdoc] Error 1
```

内容としては `libyaml` のインストールをしろというものでした

https://www.ruby-lang.org/ja/news/2022/12/25/ruby-3-2-0-released/

こちらの `3rd パーティライブラリのソースコード同梱廃止` に伴い 必要であれば自分で入れる必要があります

> libyaml や libffi のような 3rd パーティのライブラリのソースコードの同梱を廃止しました
Psych に同梱していた libyaml のソースコードは削除されました。ユーザーは自身で Ubuntu や Debian プラットフォームなら libyaml-dev パッケージをインストールする必要があります。このパッケージ名称はプラットフォームごとに異なります。
Fiddle に同梱していた libffi のソースコードも削除されました

なので以下の順でインストールを行いました

```shell
$ brew install libyaml
$ rbenv install 3.2.0 
```

# そもそも binding.irbって何？

- binding.irb は Ruby2.4から登場した標準ライブラリのデバッガ
- 標準ライブラリなので `pry-byebug` のようなgemを入れる必要はなくそのまま使える！

 バージョンを重ねるごとに新機能は増えているのですが、Ruby3.1の段階で `binding.pry` で使い続けてきた以下のようなコマンドやエイリアスが多かったがゆえに `binding.irb` で使えなかった時は違和感を覚えるものでした
 - `next` 
 - `step`
 - `continue`
 - `whereami` のエイリアスである `@`

# Ruby 3.2 のirbを試してみる

試しに以下のコードで実際に動かしてみます

```rb
class Forger
  attr_accessor :father, :mother, :child, :pet

  def family_structure
    <<~EOS
      父: #{father}
      母: #{mother}
      子供: #{child}
      ペット: #{pet}
    EOS
  end
end

forger = Forger.new
binding.irb
forger.father = 'ロイド'
forger.mother = 'ヨル'
forger.child = 'アーニャ'
forger.pet = 'ボンド'
puts forger.family_structure
```

![スクリーンショット 2023-01-24 18.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/3ba849b6-e068-04b9-7631-baf0d7ab2d97.png)


`binding.irb` のブレイクポイントで止まりました。まぁ、これは前のバージョンでもできましたね。ですが・・・

![スクリーンショット 2023-01-24 19.04.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/f32e8c4e-fb82-4376-1af5-594d2e1cf5ef.png)

おぉ、 `next` 使える！！！

ちなみに 3.1より前のバージョンで `next` すると以下のようにエラー出力されてしまい実行できません :joy: :joy: :joy: 

```
/test.rb: /test.rb:1: Can't escape from eval with next (SyntaxError)
```

ちなみにこれらのコマンドですが、 実際には debug.gem から実行しているとのことです
`show_cmds` を実行するとコマンド一覧が見れますが、以下の説明を見ると確かdebug.gemが起動していると書かれています

```
Debugging
  debug          Start the debugger of debug.gem.
  break          Start the debugger of debug.gem and run its `break` command.
  catch          Start the debugger of debug.gem and run its `catch` command.
  next           Start the debugger of debug.gem and run its `next` command.
  delete         Start the debugger of debug.gem and run its `delete` command.
  step           Start the debugger of debug.gem and run its `step` command.
  continue       Start the debugger of debug.gem and run its `continue` command.
  finish         Start the debugger of debug.gem and run its `finish` command.
  backtrace      Start the debugger of debug.gem and run its `backtrace` command.
  info           Start the debugger of debug.gem and run its `info` command.
```

その他に以下のように `.irbrc` で設定すれば色々irbのカスタマイズができました！

```.irbrc 
IRB.conf[:USE_AUTOCOMPLETE] = false
IRB.conf[:COMMAND_ALIASES].merge!({ :'&' => :show_cmds })
```

- USE_AUTOCOMPLETE: irbが開いた時コマンド入力するときのオートコンプリートを非表示にするかどうか(デフォルトは true上記のように書けば非表示にできる)

|デフォルト(trueの場合)|falseにした場合|
|---|---|
|![スクリーンショット 2023-01-24 19.30.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/cebaab00-3b68-d5b5-f644-7786548d57e5.png)|![スクリーンショット 2023-01-24 19.30.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/0080ee32-a1e4-375d-bd11-c2361b13d7d7.png) |

- COMMAND_ALIASES: irb コマンドのエイリアスを設定(上記の例だと `&` を実行すると `show_cmds` が実行される)

![スクリーンショット 2023-01-24 19.32.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/6288ac14-dd59-f34e-fc45-f5eeed3dd25a.png)


私が試した感じですが debug.gemを実行するような `next` などのコマンドに関してはエイリアスは設定できずあくまで irbのコマンドのみのエイリアスの設定できるみたいでした

# 所感

結論から言ってかなりbinding.pryに近づいたなという印象でした。 ほぼ `binding.pry` のようなデバッガーがgemのインストールなしでできるようになったのは良くなったなと思います！
.irbrc でカスタマイズできるのも使い勝手良くなりそうですね。特にオートコンプリートは個人によって意見が分かれる要素だと思うので切り替えできるのは嬉しかったです。

強いて言えば debug.gemのコマンドのエイリアスも設定できればよかったです

実際に開発する際にRuby 3.2になった際には `binding.irb` に切り替えても良いと思えました！

# まとめ

今回は 進化した binding.irb を紹介しました。開発業務行うにあたりデバッグというものは欠かせないものですし、rubyひとつとっても多岐にわたるgemがあります。そんな中標準で大分使いやすい印象に変わりました。

みなさんも是非 Ruby3.2からは binding.irbを使ってみてはいかがでしょうか