こんにちは、メディアサービス開発部Webアプリケーション開発課のシゲタです。普段はRuby on Railsによるバックエンドの開発に携わっています。
先日とあるRubyメソッドの仕様が気になりコードリーディングに挑戦したのですが、当該メソッドがどこに何という名前で定義されているのかわからず、定義にたどり着くのに時間を要してしまいました。
同じようなポイントでつまづいた方、これからコードリーディングを始めようと思っている方のために、本記事ではRubyメソッドの実装を参照する方法をいくつかご紹介したいと思います。
pry-docで参照する
pryにpry-docをインストールして$
コマンドを使うことで、C言語で実装されたRubyメソッドを参照することができます。インストール方法と詳しい使い方はREADMEをご確認ください。
$ pry [1] pry(main)> require 'pry-doc' => true [2] pry(main)> $ Array#each From: array.c (C Method): Owner: Array Visibility: public Signature: each() Number of lines: 11 VALUE rb_ary_each(VALUE ary) { long i; ary_verify(ary); RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length); for (i=0; i<RARRAY_LEN(ary); i++) { rb_yield(RARRAY_AREF(ary, i)); } return ary; } [3] pry(main)>
Array#each
の実装を参照することができました。
ここでわかるのがArray#each
はC言語ではrb_ary_each
という名前で定義されているということです。
コンパイルする前のソースコードではRubyメソッドが別名で定義されているということを知らないと、探したいメソッドの定義を見つけることはできません。
(私はこれを知らないがためにgithub上でメソッドの定義が見つからず躓いてしまいました。def inspect
などと検索したって探しているものは見つかりません)
なので、ローカルやgithubからメソッドを検索する際には、先にpry-docや次で紹介するリファレンスから探したいメソッドがC言語では何と定義されているの先に探すことをお勧めします。
リファレンスから参照する
Rubyのリファレンスからもソースコードを参照することができます。
リファレンスから探したいメソッドのrdocを開く
rdocから"click to toggle source"をクリック
下にスクロースするとソースコードが表示される
リファレンスからメソッドの実装を一覧できるので、パラパラと眺めてみるのも面白そうですね。
Rubyリポジトリをgit cloneしてローカルから参照する
ローカルにgit cloneすれば、pry-docやリファレンスから参照することができないprivateなメソッドを参照することができます。
githubで検索して参照する
もちろんgithubのRubyリポジトリから検索して参照することもできます。
まとめ
Rubyメソッドの実装を参照するためのいくつかの方法をご紹介しました。
ちなみに、冒頭に記述した実装の気になるメソッドとはObject#inspect
です。インスタンスをpした時に出力されるフィールドか何かのような文字列がどんな仕様で出力されているのか気になり調べようとした次第です。
irb(main):001:1* enumerator = Enumerator.new do |e| irb(main):002:1* [1, 2, 3].each {|h| e << h} irb(main):003:0> end => #<Enumerator: #<Enumerator::Generator:0x00007fd1772dcdc8>:each> irb(main):004:0> # ↑ こんなやつ
また、本記事を書くにあたりruby-jp Slackで有識者の方に教えていただいた内容を参考にさせていただきました。教えていただいた皆様にはこの場を借りて感謝申し上げます。
最後に
ブックウォーカーでは物理・電子・Web連載問わず漫画や本が好き、あるいは長年運用されてきたWebサービスを紐解き、より良い形に作り替えていくことに興味があるWebアプリケーションエンジニアを募集しています。
もし興味がありましたらぜひ、ブックウォーカーの採用情報ページからご応募ください。