giftee Tech Blog

ギフティの開発を支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信しています。

RubyWorld Conference 2019 Day2 に参加しました

こんにちは。ギフティの鳥淵です。

RubyWorld Conference 2019 に参加させていただきましたので、2日目のレポートをします。 RubyWorld Conference全体についてや1日目についてはこちらの記事をご覧ください。

2日目全体の感想

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はそうではないと考えていました。 次のようなクラスがあった場合、Classinstance_methodedible?を持つことになってしまうためです。

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_methodedible?を持つものを探します。 しかし見つかりませんでした。

次にコワーキングスペースでObjectSpaceというアイディアを得た探偵Deeはクラスの作成前後のT_CLASSの数を比較してみました。 1つ新しいクラスを作成したので、1増えると思っていたのですが、実際には2つ増えていました。

更に混乱する思いを抱えながら探偵Deeは友人と約束していたSmalltalkのレクチャーに参加しました。 そこで「Smalltalkにおいてはclassclassmetaclassである」という話を聞きます。 この話から、探偵Deeは1つのクラスを作成すると2つのオブジェクトが増える理由にピンときました。 慌てて家に帰り、Cakeからclassに関連するメソッドを探しました。

探した結果、singleton_classに行き着きます。 singleton_classancestorsinstance_methodedible?を持つものを探したところ、Cakesingleton_classに持っていることがわかりました。

Mikeに報告に行く前に更にsingleton_classについて詳しく知るために、探偵DeeはRubyコミッターのEllenに話を聞きました。 そこでsingleton_classがDSLと関連していること、Railsではmigration,resources,RspecなどでDSLがマジックのように活用されていることを教えられます。 そして、探偵DeeはMikeの元に報告に行きました。

物語のオチはぜひ動画で確認ください。

最後に

質疑応答の時間に、「Rubyの裏側を知ったことが、普段Railsを使用している中でどのような影響があったのか」という質問に対して「理解をすることでより自信を持って対応することができる」という回答をされていたのがとても印象に残っています。 私も普段Railsを使用して開発をしているにも関わらず、RubyやRailsの裏側に目を向けたことはほとんどありませんでした。 もっと自信をもって日々の問題に対応していきたいと思っていたところだったので、裏側も含めRubyやRailsについて更に学んでいこうと思います。