Tech Racho エンジニアの「?」を「!」に。
  • 開発

RubyのIRBやpryでメソッドの定義元をすっと調べる方法

こんにちは、hachi8833です。

先週弊社で行われたコードリーディング勉強会で、講師のmorimorihogeさんが終盤で教えてくれたIRBpry向けのテクニックをご紹介します。勉強会本編も後日記事にいたしますのでご期待ください。

メソッドの定義元を調べる

任意のオブジェクトの#methodsメソッドを呼ぶと、以下の様にそのオブジェクトで使えるメソッド一覧のSymbol配列を取得できますが、そこで見つけたメソッドが実際にはどのクラスやモジュールで実装されているのかをその場で知りたいことがあります。

161014_1844_fsFEBv

実は.method(:メソッド名).ownerで簡単に取得できます。Methodオブジェクトを取ってきて情報を参照しているだけです。

161014_1849_RiC8Nk

以上はRubyの場合ですが、RailsコンソールでももちろんOKです。

161017_1109_FpRhwL

161017_1109_HN6hUg

定義元は.ownerを付けなくてもわかる場合もありますが、以下のようにメッセージが長くなると読み取りが面倒なので付けておくのがよいでしょう。

161017_1112_x1yEic

参考: 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個くらいのプログラミング言語をそれなりに使えるようになるくらいまで習得しておくと、比較しながら言語の特徴を理解できるので割とオススメです。

関連記事


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。