ラーメン界の Basic Object を食べに行った話 🍜

486 Views

October 24, 23

スライド概要

関連スライド

各ページのテキスト
1.

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

2.

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

3.

ペパボのいいところ

4.

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

5.

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

6.

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

7.

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

8.

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

9.

ドキュメントを見てみる

10.

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

11.

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

12.

なんだこれは?

13.

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

14.

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

15.

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

16.

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

17.

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

18.

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

19.

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

20.

後日談

21.

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

22.

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