読者です 読者をやめる 読者になる 読者になる

Pry で試行錯誤しながらスクリプトを書く

DB からレコードを引いてきて、その値をもとに HTTP API を叩くとか、そういったコードを書くこと機会はたくさんある。

むずかしいことを一度にたくさん考えられないので、逐次、自分が正しい (= 意図した) 状態にあるか、ということを確認しないとこういう複雑なコードを正しく書けない。
むずかしいというのは、外部との入出力を扱うということ。

ロガー、print デバッグを使うのはよくやる。テストではよくやる。仕事では Perl を書いているので Test::More::diag とかちょくちょく挟んでみたりする。
これでもよいけれど、ひとついけていないのはどういう状態か確認したあと、たとえばその状態が間違っていたので正したり、あるいは意図したとおりだったのでそのまま次のステップに進めたりだとか、そういったことができない。

そこで Pry を使う。
binding.pry でそのスコープの中で REPL のセッションを開始する。いわゆるデバッガのようなことができる。

さらに Ruby はクラスベース OOP のための実装が言語のコアに組み込まれており、オブジェクトがリッチなのでわからないことがあればオブジェクトに聞けばよいという安心感がある。
どんなメソッドが定義されているか知りたければ Object#methods を呼べばよい。

ところで依存する gem の管理に Bundler を使うことがほとんどだと思うけれども、Bundler が関知する依存関係の中に Pry が含まれていなくとも Pry を使うことはできる。

require "bundler" unless defined?(Bundler)
Bundler.require

# ...

binding.pry if defined?(Pry)

こんなスクリプトを実行するときに ruby -rpry script.rb のように実行すると Pry が定義されているので REPL のセッションが始まる。-rpry をつけなかった場合、Pry が定義されないので binding.pry は評価されないので実行時エラーは発生しない。