Slide 1

Slide 1 text

ラーメン界の Basic Object を食べに行った話 GMOペパボ株式会社 黒宮寛之

Slide 2

Slide 2 text

自己紹介 あだ名:くろみー 新卒エンジニアです 京大で博士号を取得しました! 3度の飯よりラーメン

Slide 3

Slide 3 text

ペパボのいいところ

Slide 4

Slide 4 text

社内のSlack に #ラーメン部 がある

Slide 5

Slide 5 text

ラーメン帰り 「なんかおすすめのラーメンありますか?」 「東京だと大勝軒は有名ですよね」 「大勝軒・・・あー池袋のあそこですか?」

Slide 6

Slide 6 text

「池袋も有名ですけど大勝軒といえば永福町ですよ」 「永福町ってなんかありましたっけ?」 「まさか行ったことないんですか?」 「はい」 「くろみーさん、大勝軒を知らないなんて Basic Object を知らずに Ruby 使ってるよう なもんすよ」

Slide 7

Slide 7 text

大勝軒のラーメン 現代ラーメンの生みの親(S氏談) 1955年創業 王道の 煮干し豚骨醤油 関東近郊に数多くのれん分け

Slide 8

Slide 8 text

Ruby の Basic Object クラス 全ての Object の生みの親 class Hoge end puts Hoge.superclass # => Object puts Hoge.superclass.superclass # => BasicObject puts Hoge.superclass.superclass.superclass # => nil

Slide 9

Slide 9 text

ドキュメントを見てみる

Slide 10

Slide 10 text

Object クラス 全てのクラスのスーパークラス。オブジェクトの一般的な振舞いを定義します。このク ラスのメソッドは上書きしたり未定義にしない限り、すべてのオブジェクトで使用する ことができます。 https://docs.ruby-lang.org/ja/latest/class/Object.html

Slide 11

Slide 11 text

Basic Object Class について 特殊な用途のために意図的にほとんど何も定義されていないクラスです。Objectクラス の親にあたります。Ruby 1.9 以降で導入されました。 https://docs.ruby-lang.org/ja/latest/class/BasicObject.html

Slide 12

Slide 12 text

なんだこれは?

Slide 13

Slide 13 text

実際に動かして違いを見てみる

Slide 14

Slide 14 text

Object クラスを継承 結果はどうなる? class Fuga < Object def initialize(target) @target = target end def method_missing(message, *args) @target.__send__(message, *args) end end fuga = Fuga.new(1) print fuga.eql? 1

Slide 15

Slide 15 text

BasicObject クラスを継承 結果はどうなる? class Fuga < BasicObject def initialize(target) @target = target end def method_missing(message, *args) @target.__send__(message, *args) end end fuga = Fuga.new(1) print fuga.eql? 1

Slide 16

Slide 16 text

正解 Object クラスを使った場合:false BaiscObject クラスを使った場合: true

Slide 17

Slide 17 text

なんでこんなことが起こるのか? Object クラスでは eql? メソッドがすでに定義されている Fuga のインスタンスと 1 が一致しているかがチェックされる BasicObject クラスは eql? メソッドが定義されていない method_missing が呼び出され結果的に @target 変数に入っている eql? メソ ッドが呼び出される 1 と 1 が一致しているかがチェックされる

Slide 18

Slide 18 text

何が嬉しいのか? いわゆるメタプログラミング的な用途に便利 基本的にはほぼすべてのクラスの親は Object と考えて差し支えありません。しかし、 ある種のクラスを定義する際には Object クラスは持っているメソッドが多すぎる場合 があります。 例えば、 BasicObject#method_missingを利用して Proxy パターンを実装する場合には Object クラスに定義済みのメソッドはプロクシできないという問題が発生します。こ のような場合に Object ではなく BasicObject から派生して問題を解決できます。 https://docs.ruby-lang.org/ja/latest/class/BasicObject.html

Slide 19

Slide 19 text

とはいえ BasicObject を使わないといけない機会は少ない 通常のクラスは Object またはその他の適切なクラスから派生すべきです。真に必要な 場合にだけ BasicObject から派生してください。 https://docs.ruby-lang.org/ja/latest/class/BasicObject.html トリビアの一つとして覚えて帰ってください😎

Slide 20

Slide 20 text

後日談

Slide 21

Slide 21 text

この話をS氏にしてみたところ 「知らなかった」 Basic Object を知らずに Ruby を使っていたことが判明した ラーメンの勉強と同じくらい Ruby の勉強もしないといけない

Slide 22

Slide 22 text

蛇足 私の大勝軒のレビューについてはこちらのブログをお読みください https://blog.kuromiyahiroyuki.tech/entry/2023/10/15/205502