こんにちは。技術チームの高崎です。 今月の社内勉強会ではマネージャーの張 韵杰(YunjieZhang)さん指導のもと、Rubyメタプログラミング勉強会を開催しました!
Inagoraでは主に、Ruby(Rails)とPHP(Laravel, FuelPHP)を利用してシステム開発を行っています。自分自身プログラミング経験はありましたが、Rubyの経験は半年程度なので、Rubyの知識を整理するいい機会になりました。 今回は勉強会のポイントをまとめてみたいと思います!
Rubyはすべてがオブジェクト
Rubyの経験の無いメンバーもいるので、まず、Rubyの性質を勉強しました。RubyもPHPもオブジェクト指向言語であるので、考え方自体に大きな違いは有りませんが、大きな違いとしてあるのが、Rubyはすべてがオブジェクトであるということ。 他の言語でいうnullにあたるnilも、れっきとしたNilClassのオブジェクトです。
Javaなどの言語では、オブジェクトは、Classをインスタンス化したもの、という意味で使われますが、Rubyの場合は、Classも一つのオブジェクトとして、扱われます。その辺りは、他の言語経験者でも混乱しそうだなと感じました。
メタプログラミング is 何
メタプログラミングは一言で言えば、「コードを書くためのコードを書く」という手法です。 これだけ聞いてもあまりイメージは理解出来ないと思いますが、実はRailsを利用していれば、無意識のうちにメタプログラミングの恩恵を受けています。もっともわかりやすい例であれば、 Railsで利用されている、ORMのActiveRecord(オブジェクトとデータベースのマッピングを行う有名なライブラリ)です。 ActiveRecordを利用すると、例えば、Usersテーブルに登録された、Userのuser_nameカラムのデータを取得する場合、以下の様なコードを書きます。
自分でUserクラスに、アクセサメソッド(インスタンス変数を操作するgetter, setterなど)を定義しなくても、ActiveRecordが、実行時に、指定したカラム名(今回はuser_name)を取得するアクセサメソッドを動的に定義しているからです。 そのため、存在しないカラム名を指定すると、NoMethodErrorが返ります。
最初は、メタプログラミングはRuby上級者向けのテクニックではないか?とややビビっていたのですが、これまで自分でも知らず知らずに、メタプログラミングを利用したライブラリを利用していたことを知ると、一気に視野が広がった気がします。 その後で、メタプログラミングを行う上で重要なテクニックである、「OPEN CLASSES(オープンクラス)」「MONKEY PATCH(モンキーパッチ)」「METHOD MISSING(メソッドミッシング)」などの概念を学びました。
特に「OPEN CLASSES(オープンクラス)」「MONKEY PATCH(モンキーパッチ)」という手法を知れたことで、外部ライブラリがどの様に、既存クラスを拡張しているのか、理解することが出来ました。これまで、外部ライブラリを利用することしか経験がありませんでしたが、作る側の視点をもつことが出来たのが、今回の勉強会の大きな収穫でした!