今日は、Shibuya.rbに参加してきました。各自、読みたいミドルを選んで、テーブルに分かれて、それぞれ読んでみるという感じです。私は、Rack::Auth::Basicを読んでました。シンプルですぐに完結しているので読みやすい感じだったと思います。同じ画面で一緒にソースを見て、順に追っていくという感じで、読んでみました。テーブルごとにモニタがあれば、一緒に読む時にはかなり捗るんだろうけど。中盤にLT枠があったので、突発で資料も無しにPryについて話をさせてもらいました。最近、ソースコードを読んだり、Railsでspec書いたりする時に、これは便利だ!と感じたことを話すいい機会だと思ったわけです。いうわけで、ざっくりと話した内容について書いてみます。pryを起動したら、まずはhelpと打ってみましょう。コマンドが出てきます。この中で、メインで活用したいコマンドは以下です。引数で指定したメソッドの定義されているコードを見る。エディタでpryに入力するコードを記述できる。引数で指定したメソッドを定義しているファイルをエディタで開く。cdとlsはこんな感じで使えます。_pry_(実際には戻り値には色が付いてます。他にインスタンス変数なんかも参照できます。-vを使うと、スーパークラスも含めてメソッドを参照できます。hoge.methods.sortとかやることがあると思いますが、pryのコマンドは定義されているコンテキストごとにまとまって表示されるため、非常に見やすいところがいい感じです。show-methodはこんな感じで使います。128endこのように、メソッドが定義されているファイル、行数と定義内容が参照できます。これは、MongoidをインクルードしているUserクラスに入り、deviseの認証定義をshow-methodしたところです。定義場所が明確に分かるので、細かく知りたい時は、コードを読む起点として活用できます。環境変数EDITORで指定しているエディタでこの定義場所を開くことができます。このまま付近を読んでもいいし、そのまま閉じれば、pryに戻ってくることができます。editはpryで実行するrubyのコードをそのままエディタで記述して処理できるもので、irbにおけるinteractie_editorと同様なので、詳しい説明は省きます。これだけでもかなり便利なのですが、pryには更に強力な機能があります。今回、Rackミドルウェアを読む際にも活用しましたが、コード中にbinding.pryと記述することで、そのタイミングでインタラクティブモードに移行してpry上でコードを実行できるようになります。Hello.newrackupしてアクセスしてみるとこうなります。pry(#<Hello>)>envと打ってみる。"REMOTE_USER"=>"test"}Rack::Auth::Basicでは、HTTP_AUTHORIZATIONヘッダから、credentialsを取得しているという記述がありました。内容を確認してみようってことで、アクセスの途中で実行を止めて、envを見る、という形で活用してみました。exitしてpryを終了すると続きのコードが流れてきます。ちなみに、jugyoさんが作った、ir_bというgemでirb上でも同じことができます。bという形で記述します。同じコードでpryも起動できるように、pry用のインターフェースも用意してくれています。https://github.com/jugyo/ir_b)他にもrspecのコードの中にbinding.pryを仕込むと、以下のようなことが出来ます。pry(#<RSpec::Core::ExampleGroup::Nested_1::Nested_2>)>subjectには、Mongoidのオブジェクトが入っています。このオブジェクトに対して、即座にshouldを呼び出し、テストコードの動きを確認できます。そのコンテキストで使えるメソッドに対して補完が効くため、have_と打って、TABを押すと、こんな感じでマッチャーが見れたりします。have_instance_methodrspecを対話的に実行するなら、a_matsudaさん作のinteractive_rspecなんかもあります。irbでシンプルに実行するなら、こちらの方が良いでしょう。https://github.com/amatsuda/interactive_rspec)今回、話した事は、irbの拡張設定をやったり、拡張するgemを導入することで、ある程度、irbでも実現することが可能だったりします。色付けたり、エディタで編集したり、実行途中で止めたり。show-methodによる参照は非常に強力で、これはirbには無い機能です。これらの機能は、ちょっとした時に覚えておくと凄く便利感を味わえます。これだけ覚えておきましょう。一方で、ruby-debug等と違ってデバッガでは無いため、ステップ実行、ブレークポイントの指定などは出来ません。一連のフローを検証したい時は、ruby-debug等を活用し、場合によって使い分けていくのが良いと思います。発表内容にいくつか付け加えて、まとめてみました。活用法については、日本語の情報ってあんまり無かったような気がします。この記事が誰かの参考になれば幸いです。追記:書いた後で、Twitterで情報を頂いて、ruby-debugにpryコマンドを追加できる、ruby-debug-pryなるものがあるらしいです。