こんにちは、hachi8833です。
先週弊社で行われたコードリーディング勉強会で、講師のmorimorihogeさんが終盤で教えてくれたIRBやpry向けのテクニックをご紹介します。勉強会本編も後日記事にいたしますのでご期待ください。
メソッドの定義元を調べる
任意のオブジェクトの#methods
メソッドを呼ぶと、以下の様にそのオブジェクトで使えるメソッド一覧のSymbol配列を取得できますが、そこで見つけたメソッドが実際にはどのクラスやモジュールで実装されているのかをその場で知りたいことがあります。
実は.method(:メソッド名).owner
で簡単に取得できます。Methodオブジェクトを取ってきて情報を参照しているだけです。
以上はRubyの場合ですが、RailsコンソールでももちろんOKです。
定義元は.owner
を付けなくてもわかる場合もありますが、以下のようにメッセージが長くなると読み取りが面倒なので付けておくのがよいでしょう。
参考: Railsコンソールをpry化
既に皆様もお使いになっていると思いますが、pry-railsを導入するとRailsコンソールで標準のIRBの代わりにpryを使えるようになります。
RailsなどのGemfileに以下のようにpryを追加し、Railsのホームディレクトリでbundle install
を実行することでdevelopment環境とtest環境のRailsコンソールがpry化されます。今回の記事とは関係ありませんが、ついでにpry-doc、pry-byebug、pry-stack_explorerもインストールしてしまいましょう。
group :development, :test do
gem 'pry'
gem 'pry-rails'
gem 'pry-doc'
gem 'pry-byebug'
gem 'pry-stack_explorer'
end
Railsと関係なくpryをインストールするには、gem install pry
を実行します。
morimorihogeコメント
morimorihogeです。最近補足コメントの人化してますね。Civ6が待ち遠しいです。
週一の勉強会のネタが切れてきたのでGemのコードリーディングについての話をしてみたのですが、その中で「そういえば、better_errorsとかを使ってデバッグコンソールを取った時、オブジェクトにはアクセスできるけどメソッドの定義元が分からないから調べられると便利だよなー」とふと思って調べてみたのがMethodオブジェクトでした。
Javaとかだとリフレクション系の機能のドキュメントを眺めていくという方法もありましたが、Rubyは設計思想的になんでもオブジェクトな思想なので「#methodsでメソッド一覧が取れるなら、methodオブジェクトもあるよねJK」ということで調べたらあったぜ、という流れです。
僕自身はRubyのコアの方にはそれほど詳しくないのですが、言語の設計思想や他の言語との比較なんかがなんとなく頭に入ってると「この言語はこういう設計だから、この問題はこの辺を調べれば解決できるはず」という最初の取っかかりができるので、問題解決が早くなることもあります。
仕事でコードを書いていると即物的な解決策を求めてしまいがちですが、たまには言語自体の勉強なんかをする機会も持つとプログラマとしての幅が広がるのではないでしょうか。
とか偉そうなことを書いてみました。2〜3個くらいのプログラミング言語をそれなりに使えるようになるくらいまで習得しておくと、比較しながら言語の特徴を理解できるので割とオススメです。