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
ひとりメタプログラミングRuby勉強会
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
yokoto
July 16, 2021
Programming
0
190
ひとりメタプログラミングRuby勉強会
yokoto
July 16, 2021
Tweet
Share
More Decks by yokoto
See All by yokoto
エキスパートRails基礎
yokoto
1
490
LINEボットを作ってみよう
yokoto
0
49
Other Decks in Programming
See All in Programming
Agent Skills Workshop - AIへの頼み方を仕組み化する
gotalab555
15
8.4k
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
170
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
4
500
エージェント開発初心者の僕がエージェントを作った話と今後やりたいこと
thasu0123
0
240
AIに任せる範囲を安全に広げるためにやっていること
fukucheee
0
130
15年目のiOSアプリを1から作り直す技術
teakun
1
620
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
120
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
410
AI活用のコスパを最大化する方法
ochtum
0
130
オブザーバビリティ駆動開発って実際どうなの?
yohfee
3
810
メタプログラミングで実現する「コードを仕様にする」仕組み/nikkei-tech-talk43
nikkei_engineer_recruiting
0
170
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
380
Featured
See All Featured
Everyday Curiosity
cassininazir
0
160
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
Designing Powerful Visuals for Engaging Learning
tmiket
0
270
エンジニアに許された特別な時間の終わり
watany
106
240k
We Have a Design System, Now What?
morganepeng
55
8k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
250
What's in a price? How to price your products and services
michaelherold
247
13k
So, you think you're a good person
axbom
PRO
2
1.9k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
Transcript
ひとりメタプログラミングRuby勉強会 2021/3/31 横田 俊博
メタプログラミングRubyについて ・Ruby上級者(?)向けの本、というイメージだったけどどんな本なんだろう。
序文 “Rubyは君を信頼する。 Rubyは君を分別のあるプログラマとして扱う。 Rubyはメタプログラミングのような強力な力を与える。 ただし、大いなる力には大いなる責任が伴うことを忘れてはいけない。” まつもとゆきひろ
引用元: https://www.yokoyan.net/entry/2020/12/30/223405 Rubyに出会ってプ ログラミングが好き になった Rubyはプログラマ を信頼してくれる Rubyが好きなの はなんで?
引用元: https://www.yokoyan.net/entry/2020/12/30/223405 Rubyに出会ってプ ログラミングが好き になった Rubyはプログラマ を信頼してくれる Rubyが好きなの はなんで?
目次 I部 メタプログラミングRuby 1章 頭文字M 2章 月曜日:オブジェクトモデル 3章 火曜日:メソッド 4章
水曜日:ブロック 5章 木曜日:クラス定義 6章 金曜日:コードを記述するコード 7章 エピローグ II部 Railsにおけるメタプログラミング 8章 Railsツアーの準備 9章 Active Recordの設計 10章 Active SupportのConcernモジュール 11章 alias_method_chainの盛衰 12章 アトリビュートメソッドの進化 13章 最後の教訓
目次 I部 メタプログラミングRuby 1章 頭文字M 2章 月曜日:オブジェクトモデル 3章 火曜日:メソッド 4章
水曜日:ブロック 5章 木曜日:クラス定義 6章 金曜日:コードを記述するコード II部 Railsにおけるメタプログラミング 8章 Railsツアーの準備 9章 Active Recordの設計 10章 Active SupportのConcernモジュール 11章 alias_method_chainの盛衰 12章 アトリビュートメソッドの進化 13章 最後の教訓
2章 月曜日:オブジェクトモデル • Rubyではクラスもオブジェクト。 ◦ 各種クラスは、Classクラスのイン スタンス。 => クラスのクラスはClassクラス。 •
Classクラスのスーパークラスは Module。 ◦ すべてのクラスはモジュールであ る
3章 火曜日:メソッド • 動的ディスパッチ(send) ◦ 実行時に呼び出すメソッドを決定 する方法 ◦ https://docs.ruby-lang.org/ja/late st/method/Object/i/send.html
• 動的メソッド(Module#define_method) ◦ 実行時にメソッドを定義する方法 ◦ https://docs.ruby-lang.org/ja/late st/method/Module/i/define_meth od.html
3章 火曜日:メソッド • ゴーストメソッド (BasicObject#method_missing) ◦ 実際には存在しないメソッドを呼び 出す方法 ◦ https://docs.ruby-lang.org/ja/late
st/method/BasicObject/i/method _missing.html
4章 水曜日:ブロック • ブロック ◦ メソッドを呼び出すときにだけ定義 できる。 ◦ https://docs.ruby-lang.org/ja/late st/doc/spec=2fcall.html#block
• Procオブジェクト ◦ ブロックをオブジェクトにしたもの。 ◦ Proc#call でオブジェクトになった ブロックを 遅延評価 する。 ◦ https://docs.ruby-lang.org/ja/late st/class/Proc.html
4章 水曜日:ブロック • ブロックはクロージャー ◦ ブロックは定義された時点で、その 場の(ローカル変数、インスタンス 変数、selfといった) 束縛 を取得
する。 ◦ ブロックの中で定義された束縛 は、ブロックが終了した時点で消え る。
4章 水曜日:ブロック • スコープゲートとフラットスコープ ◦ スコープゲート ▪ 新しいスコープをオープンする3つのキーワードのこと。 • クラス定義(
class ) • モジュール定義( module ) • メソッド定義( def ) ◦ フラットスコープ ▪ スコープゲートを超えて変数を共有する魔術。 • class → Class.new • module → Module.new • def → Module.define_method
4章 水曜日:ブロック • スコープゲートとフラットスコープ
4章 水曜日:ブロック • スコープゲートとフラットスコープ
5章 木曜日:クラス定義 • 特異メソッド ◦ 単一、特定のオブジェクトに特化し たメソッドのこと。 • クラスメソッド ◦
クラスメソッドはクラスの特異メソッ ド。 ▪ 定数で参照したクラスオブ ジェクトのメソッドを呼び出し ている。
5章 木曜日:クラス定義 • 特異クラス ◦ 特異クラスの定義式は、 class 式 において「 <<(オブジェクト)
」と記 述する。 ◦ 特異クラスに追加されたインスタン スメソッドは、オブジェクトに対して 呼び出すことができる。 ◦ 特異クラスのインスタンスメソッド = 特異メソッド。
5章 木曜日:クラス定義 • instance_eval ◦ オブジェクトのコンテキストでブロッ クを評価する。 ◦ https://docs.ruby-lang.org/ja/late st/method/BasicObject/i/instanc
e_eval.html
6章 金曜日:コードを記述するコード • Kernel#eval ◦ instance_eval と同じ eval族。 ▪ ブロックの代わりにRubyの
コード文字列を受け取る。 ▪ 渡されたコード文字列を実行 して、その結果を戻す。 ◦ 実はinstance_eval でも文字列を 渡すことができる。 ◦ https://docs.ruby-lang.org/ja/late st/method/Kernel/m/eval.html
6章 金曜日:コードを記述するコード • フックメソッド ◦ 特定のイベントにフックをかけるメ ソッド。 ▪ inherited, included,
extended, method_added などがある。 ◦ Class クラスのインスタンスメソッ ド。 ◦ イベントが発生した時にRubyに よって呼び出される。 ◦ 自分のコードでオーバーライドして 使う。
13章 最後の教訓 • メタプログラミングはRubyと深く結びついているので、魔術を使わずに Rubyの特徴的な プログラムを書くことはほとんどできない。 • オブジェクトモデルに手を加えたり、クラスを再オープンしたり、メソッドを動的に定義した り、ブロックでスコープを管理したりすることを、言語があなたに期待している。 •
『メタプログラミングはただのプログラミング』