Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ラーメン界の Basic Object を食べに行った話
Search
Hiroyuki Kuromiya
December 09, 2023
0
48
ラーメン界の Basic Object を食べに行った話
Hiroyuki Kuromiya
December 09, 2023
Tweet
Share
More Decks by Hiroyuki Kuromiya
See All by Hiroyuki Kuromiya
SQLクエリの組み立てを 自動化するSlack Bot
khiroyuki1993
2
130
notion-to-slides: convert notion page to presentation slides
khiroyuki1993
0
1.6k
R で Github Repository をきれいにする
khiroyuki1993
0
600
Paper Introduction: The Recon Approach: A New Direction for Machine Learning in Criminal Law.
khiroyuki1993
0
83
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
Embracing the Ebb and Flow
colly
84
4.5k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
For a Future-Friendly Web
brad_frost
175
9.4k
Adopting Sorbet at Scale
ufuk
73
9.1k
Speed Design
sergeychernyshev
25
670
Typedesign – Prime Four
hannesfritz
40
2.4k
4 Signs Your Business is Dying
shpigford
181
21k
Optimising Largest Contentful Paint
csswizardry
33
3k
Why Our Code Smells
bkeepers
PRO
335
57k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Transcript
ラーメン界の Basic Object を食べに行った話 GMOペパボ株式会社 黒宮寛之
自己紹介 あだ名:くろみー 新卒エンジニアです 京大で博士号を取得しました! 3度の飯よりラーメン
ペパボのいいところ
社内のSlack に #ラーメン部 がある
ラーメン帰り 「なんかおすすめのラーメンありますか?」 「東京だと大勝軒は有名ですよね」 「大勝軒・・・あー池袋のあそこですか?」
「池袋も有名ですけど大勝軒といえば永福町ですよ」 「永福町ってなんかありましたっけ?」 「まさか行ったことないんですか?」 「はい」 「くろみーさん、大勝軒を知らないなんて Basic Object を知らずに Ruby 使ってるよう
なもんすよ」
大勝軒のラーメン 現代ラーメンの生みの親(S氏談) 1955年創業 王道の 煮干し豚骨醤油 関東近郊に数多くのれん分け
Ruby の Basic Object クラス 全ての Object の生みの親 class Hoge
end puts Hoge.superclass # => Object puts Hoge.superclass.superclass # => BasicObject puts Hoge.superclass.superclass.superclass # => nil
ドキュメントを見てみる
Object クラス 全てのクラスのスーパークラス。オブジェクトの一般的な振舞いを定義します。このク ラスのメソッドは上書きしたり未定義にしない限り、すべてのオブジェクトで使用する ことができます。 https://docs.ruby-lang.org/ja/latest/class/Object.html
Basic Object Class について 特殊な用途のために意図的にほとんど何も定義されていないクラスです。Objectクラス の親にあたります。Ruby 1.9 以降で導入されました。 https://docs.ruby-lang.org/ja/latest/class/BasicObject.html
なんだこれは?
実際に動かして違いを見てみる
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
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
正解 Object クラスを使った場合:false BaiscObject クラスを使った場合: true
なんでこんなことが起こるのか? Object クラスでは eql? メソッドがすでに定義されている Fuga のインスタンスと 1 が一致しているかがチェックされる BasicObject
クラスは eql? メソッドが定義されていない method_missing が呼び出され結果的に @target 変数に入っている eql? メソ ッドが呼び出される 1 と 1 が一致しているかがチェックされる
何が嬉しいのか? いわゆるメタプログラミング的な用途に便利 基本的にはほぼすべてのクラスの親は Object と考えて差し支えありません。しかし、 ある種のクラスを定義する際には Object クラスは持っているメソッドが多すぎる場合 があります。 例えば、
BasicObject#method_missingを利用して Proxy パターンを実装する場合には Object クラスに定義済みのメソッドはプロクシできないという問題が発生します。こ のような場合に Object ではなく BasicObject から派生して問題を解決できます。 https://docs.ruby-lang.org/ja/latest/class/BasicObject.html
とはいえ BasicObject を使わないといけない機会は少ない 通常のクラスは Object またはその他の適切なクラスから派生すべきです。真に必要な 場合にだけ BasicObject から派生してください。 https://docs.ruby-lang.org/ja/latest/class/BasicObject.html
トリビアの一つとして覚えて帰ってください😎
後日談
この話をS氏にしてみたところ 「知らなかった」 Basic Object を知らずに Ruby を使っていたことが判明した ラーメンの勉強と同じくらい Ruby の勉強もしないといけない
蛇足 私の大勝軒のレビューについてはこちらのブログをお読みください https://blog.kuromiyahiroyuki.tech/entry/2023/10/15/205502