こんにちは。ギフティの鳥淵です。
RubyWorld Conference 2019 に参加させていただきましたので、2日目のレポートをします。 RubyWorld Conference全体についてや1日目についてはこちらの記事をご覧ください。
2日目全体の感想
2日目の最初はNadia Odunayoさんの基調講演、ゲストスピーカーSamuel Williamsさんのセッションとハッカーよりのセッションが続きました。
その後は、教材としてあるいは教育現場を支える技術としてのRubyの活用事例の発表がありました。1日目に高校生や高専生の来場が多く見られたのは、Rubyが教育にも活用されていることを象徴しているように感じました。
また、ランチタイムには弊社CTOの柳瀬が「RubyでWebとリアルをつなぐギフティ」というテーマでショートプレゼンテーションをさせていただきました。
このレポートでは中でも印象に残ったNadia Odunayoさんの基調講演「The Case Of The Missing Method - A Ruby Mystery Story」について取り上げます。
The Case Of The Missing Method - A Ruby Mystery Story
Mystery Storyという題の通り、探偵DeeがRubyの謎を解いていくという物語形式の講演でした。
今回の案件はapprenticeshipの面接を控えたMikeから持ち込まれた、「クラスメソッドの定義はどこから来ているのか」という内容です。
Mikeの親友兼ルームメイトで同じく面接を控えたJennyは「すべてのメソッドの定義はそのオブジェクトのクラスから来ている」と主張していますが、Mikeはそうではないと考えていました。
次のようなクラスがあった場合、Class
がinstance_method
にedible?
を持つことになってしまうためです。
class Cake def tasety? @flaver = 'carrot' end def self.edible? true end end
実際pryで確認してもClass.instance_methods.include?(:edible)
はfalse
でした。
探偵Deeはこの案件を引き受けました。
まずはancestors
を使用し、Class
以外のCake
の親クラスでinstance_method
にedible?
を持つものを探します。
しかし見つかりませんでした。
次にコワーキングスペースでObjectSpace
というアイディアを得た探偵Deeはクラスの作成前後のT_CLASS
の数を比較してみました。
1つ新しいクラスを作成したので、1増えると思っていたのですが、実際には2つ増えていました。
更に混乱する思いを抱えながら探偵Deeは友人と約束していたSmalltalkのレクチャーに参加しました。
そこで「Smalltalkにおいてはclass
のclass
はmetaclass
である」という話を聞きます。
この話から、探偵Deeは1つのクラスを作成すると2つのオブジェクトが増える理由にピンときました。
慌てて家に帰り、Cake
からclass
に関連するメソッドを探しました。
探した結果、singleton_class
に行き着きます。
singleton_class
のancestors
でinstance_method
にedible?
を持つものを探したところ、Cake
のsingleton_class
に持っていることがわかりました。
Mikeに報告に行く前に更にsingleton_class
について詳しく知るために、探偵DeeはRubyコミッターのEllenに話を聞きました。
そこでsingleton_class
がDSLと関連していること、Railsではmigration
,resources
,Rspec
などでDSLがマジックのように活用されていることを教えられます。
そして、探偵DeeはMikeの元に報告に行きました。
物語のオチはぜひ動画で確認ください。
最後に
質疑応答の時間に、「Rubyの裏側を知ったことが、普段Railsを使用している中でどのような影響があったのか」という質問に対して「理解をすることでより自信を持って対応することができる」という回答をされていたのがとても印象に残っています。 私も普段Railsを使用して開発をしているにも関わらず、RubyやRailsの裏側に目を向けたことはほとんどありませんでした。 もっと自信をもって日々の問題に対応していきたいと思っていたところだったので、裏側も含めRubyやRailsについて更に学んでいこうと思います。