Pryとは何か
PryはRubyの強力なランタイム開発コンソールであり、IRBの代替品です. Pryは、Ruby言語にREPL駆動のプログラミングをもたらす試みであり、IRBの代替品以上のものを目指しています.
Pryの主な特徴は以下の通りです:
- ソースコードの閲覧(pry-doc gemを使用してコアCソースも含む)
- ドキュメンテーションの閲覧
- ライブヘルプシステム
- エディタでメソッドを開く(
edit Class#method) - シンタックスハイライト
- コマンドシェル統合(Pry内からエディタを起動、gitを実行、rakeを実行する)
- Gist統合
- 状態の周りを移動(
cd,lsなど) - ランタイム呼び出し(開発者コンソールまたはデバッガとしてPryを使用)
- エキゾチックなオブジェクトのサポート(BasicObjectインスタンス、IClassesなど)
- 強力で柔軟なコマンドシステム
- 履歴の表示と再生の能力
- IPython、Smalltalk、その他の高度なREPLからインスパイアされた多くの便利なコマンド
- リモートセッション、完全なデバッグ機能などを提供するプラグインの幅広い範囲
Pryは、Rubyのソースコードを読むとき、grepやctagsだけで読んでいるとどこにどういう値が入るのか頭で考える必要があり大変です. そういう時、実際に動かしながらPryを使って中身を確認すると、どういう動きをしているのか楽に把握できます. 普通のエディタを使ってRubyを書いている人にとって、IDE的な機能を提供してくれるのがPryといえます.
RubyのループとPry
Rubyのループは、一連の命令を繰り返し実行するための制御構造です. Pryは、このループ内でデバッグを行うための強力なツールです.
Rubyのループには、for, while, until, loop, times, eachなどの種類があります. これらのループ内でbinding.pryを使用すると、その時点でプログラムの実行を一時停止し、PryのREPL(Read-Eval-Print Loop)が起動します. REPLは、ユーザーがコードを入力し、その結果をすぐに表示する環境です.
Pryを使用すると、ループの各反復で変数の値を確認したり、コードの動作をステップバイステップで追跡したりすることができます. これは、コードの動作を理解したり、バグを特定したりするのに非常に役立ちます.
しかし、ループ内でbinding.pryを使用すると、ループの各反復でPryのセッションが開始されるため、ループを抜けるにはquitを何度も入力する必要があります. これを避けるためには、exit-programや!!!を使用してPryを無条件に終了させるか、disable-pryを使用してPryを無効にすることができます. ただし、これらの方法はそれぞれ一部の副作用があるため、注意が必要です.
Pryを使ったループからの脱出方法
Rubyのループ内でPryを使用すると、その時点でプログラムの実行が一時停止し、PryのREPLが起動します. しかし、ループの各反復でPryのセッションが開始されるため、ループを抜けるにはexitを何度も入力する必要があります.
Pryでは、ループから脱出するためのいくつかの方法が提供されています:
exit:現在のループを終了します. ただし、これは「ソフトな終了」であり、ループの次の要素に移動します.!!!(トリプルバング):任意の反復から脱出し、Pryコンソールを強制的に終了します. これは「ハードな終了」とも呼ばれます.exit-program:プログラム全体を終了します.
これらのコマンドを使用することで、Pryのセッション中にループから脱出することが可能になります. ただし、これらのコマンドはそれぞれ一部の副作用があるため、注意が必要です.
また、ループの最初の反復でのみbinding.pryをヒットさせたい場合は、以下のようにbinding.pryに条件を付けることができます:
(1..100).each do |i|
binding.pry if i == 1
puts i
end
このコードでは、i == 1のときだけbinding.pryが実行され、Pryのセッションが開始されます. その後、exitを入力すると、現在のセッションが終了し、ループが続行されます.
Pryのその他の便利な機能
Pryは、Rubyの開発者コンソールとして多くの便利な機能を提供しています. 以下に、その主な機能をいくつか紹介します:
- ソースコードの閲覧:
show-methodや$を使うとメソッドの定義を見ることができます. CRubyのソースを見たいときはpry-docgemをインストールする必要があります. - ドキュメンテーションの閲覧:
show-docやriを使うとドキュメンテーションを見ることができます. - エディタでメソッドを開く:
edit-method Class#methodを使うと、エディタでメソッドを開くことができます. - シンタックスハイライト:Pryはシンタックスハイライトを提供しています.
- コマンドシェル統合:
.で始めると以降をシェルのコマンド入力として受け付けます. これにより、Pry内からエディタを起動したり、gitを実行したり、rakeを実行したりすることができます. - Gist統合:PryはGistと統合しています.
- ランタイム呼び出し:
binding.pryを使うと、プログラムの実行を一時停止し、PryのREPLが起動します. - エキゾチックなオブジェクトのサポート:PryはBasicObjectインスタンスやIClassesなどのエキゾチックなオブジェクトをサポートしています.
- 強力で柔軟なコマンドシステム:Pryは強力で柔軟なコマンドシステムを提供しています.
- 履歴の表示と再生の能力:Pryは履歴の表示と再生の能力を持っています.
- 便利なコマンド:PryはIPython、Smalltalk、その他の高度なREPLからインスパイアされた多くの便利なコマンドを提供しています.
これらの機能は、Rubyの開発をより効率的で楽しいものにします.