Gemの「魔法」を解き明かす:RubyGemsのソースコードを読んで理解する方法
Railsアプリを開発していると、膨大な数のgem(ライブラリ)を使うことになります。中には「まるで魔法だ!」と感じてしまうものもあるでしょう。しかし、その魔法は一体どうやって実現されているのでしょうか?
実は、ほとんどのgemが行っていることは、あなたにも決してできないことではありません。それは単なるRubyコードなのです。ときには複雑なRubyコードであることもありますが、そのコードを探検してみれば、魔法の正体が少しずつ見えてくるはずです。
まずはソースコードを見つける
gemの仕組みを理解したいなら、何よりも先にそのコードを見つけなければなりません。
特定のメソッドについて詳しく知りたい場合は、methodとsource_locationを使えば簡単にソースの所在を突き止められます。以下がその例です。
irb(main):001:0> ActiveRecord::Base.method(:find).source_location
=> ["/usr/local/lib/ruby/gems/2.1.0/gems/
activerecord-4.2.0.beta4/lib/active_record/core.rb", 127]
では、調べたいメソッドが複数ある場合はどうすればいいのでしょうか?
Railsアプリのディレクトリ内でコンソールを開いていれば、gemのコードへ直接アクセスできます。
~/Source/gem_example[master] jweiss$ bundle open rack
Gemfileに含まれているgemであれば、bundle open rackを実行するだけで、エディタ上にrack gem全体が開かれます。その中のファイルを自由に閲覧できます。
どこから読み始める?
gemのコードの場所がわかったら、次はどこから理解を始めればいいのでしょうか?
activerecordの仕組みを知ろうとして、いきなりlib/active_record.rbを読み始めても、ほとんど前に進めません。そこにあるのはautoloadやrequireの羅列だけだからです。
gemを理解するのは、アプリである程度使い込んだ後のほうがはるかに簡単です。gemが自分のためにどんな仕事をしてくれているのか把握できていれば、どのクラスやメソッドから読み始めるべきか、ある程度見当がつくものです。
興味深いメソッド名がいくつかわかったら、source_location、エディタの「プロジェクト内検索」機能、あるいはコマンドラインのagなどを活用して、それらのメソッドがどこで定義されているかを探しましょう。ここからが本当の楽しみの始まりです。
gemのコードは自分のマシン上にあるのですから、好きなように書き換えて構いません!壊してしまっても、他の人が気づくことはありません。
私がgemの仕組みを理解しようとするときは、ただコードを読むだけにとどまりません。gemの中にputs文を差し込んだり、例外を投げてアプリがどうやってその行にたどり着いたのかを追跡したり、コードをいろいろといじって作者の意図を推し量ったりしています。
一度トリックの種がわかれば、魔法はぐっと色褪せます。そして、奇妙な状況でそのコードがどう振る舞うかを推測する必要もなくなります。自分の目で直接確かめられるのですから。
後片付けを忘れずに
gemのコードをいじった後、アプリはかなりの惨状になっている可能性があります。最悪の場合、まったく起動しなくなることもあるでしょう。仮に動いたとしても、追加したputs文の出力がコンソールに大量に流れ続けます。
幸い、RubyGemsには元の状態へ戻すための手軽な方法が用意されています。
~ jweiss$ gem pristine activerecord -v 4.2.0
Restoring gems to pristine condition...
Restored activerecord-4.2.0
また、どのgemをいじったのか忘れてしまった場合で、根気があるならこちらを。
~ jweiss$ gem pristine --all
このコマンドを実行すれば、すべてのgemがインストール直後の状態へと復元されます。
さあ、何を探検しますか?
gemの中のコードを見つけて読み、実際に手を動かして探検することで、自分が依存しているコードをより深いレベルで理解できるようになります。そして、もう推測や憶測に頼る必要はありません。
この記事は、もともと筆者のメーリングリスト購読者限定でお送りしていたものです。毎週金曜日にこうした記事をメールで受け取りたい方は、ぜひご登録ください!
-
Rubyプログラムのデバッグと修正方法を徹底解説|スタックトレースの読み方からPry・Byebugまで
書いたプログラムが、初回実行で思い通りに動くことってどれくらいありますか? 多くの場合、プログラムは期待どおりには動いてくれないもの。そんなときに頼りになるのがRubyのデバッグという技術です。原因を突き止めるための頼れる相棒といえるでしょう。 次のようなエラーメッセージを見たことはありませんか? undefined method some_method for nil:NilClass これは、nil値がコードの中に紛れ込んでしまったことを意味します。 本記事で紹介するテクニックを身につければ、この問題や似たようなトラブルにも自信を持って対処できるようになりますよ! エラーとスタックトレース
-
iPadとiPhoneでQRコードをスキャンする方法|アプリ不要で簡単に読み取る手順
2018年に登場したiOS 12には、iPadやiPhoneのユーザー体験を大きく向上させる便利な機能が多数追加されました。そのひとつが「QRコードのスキャン」機能です。この機能を使えば、チケットやクーポン、商品の成分表示などの情報を素早く取得でき、買い物の前に商品について数秒で調べることも可能になります。さらに、スマートフォンのカメラだけで直感的にQRコードを読み取れるため、面倒な操作も一切必要ありません。この記事では、iPadとiPhoneでQRコードをスキャンする具体的な方法を詳しく解説します。QRコードとは?QRコード(Quick Responseコード)とは、白と黒の四角形が格子状に