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
yokoto
July 16, 2021
Programming
0
180
ひとりメタプログラミングRuby勉強会
yokoto
July 16, 2021
Tweet
Share
More Decks by yokoto
See All by yokoto
エキスパートRails基礎
yokoto
1
460
LINEボットを作ってみよう
yokoto
0
47
Other Decks in Programming
See All in Programming
大規模アプリのDIフレームワーク刷新戦略 ~過去最大規模の並行開発を止めずにアプリ全体に導入するまで~
mot_techtalk
0
410
Railsだからできる 例外業務に禍根を残さない 設定設計パターン
ei_ei_eiichi
0
420
2分台で1500examples完走!爆速CIを支える環境構築術 - Kaigi on Rails 2025
falcon8823
3
3.5k
(Extension DC 2025) Actor境界を越える技術
teamhimeh
1
250
CSC305 Lecture 06
javiergs
PRO
0
210
CSC305 Lecture 04
javiergs
PRO
0
260
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
convto
2
450
組込みだけじゃない!TinyGo で始める無料クラウド開発入門
otakakot
0
150
Six and a half ridiculous things to do with Quarkus
hollycummins
0
140
Go Conference 2025: Goで体感するMultipath TCP ― Go 1.24 時代の MPTCP Listener を理解する
takehaya
8
1.6k
iOSアプリの信頼性を向上させる取り組み/ios-app-improve-reliability
shino8rayu9
0
170
Goで実践するドメイン駆動開発 AIと歩み始めた新規プロダクト開発の現在地
imkaoru
4
790
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
970
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
GitHub's CSS Performance
jonrohan
1032
470k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Facilitating Awesome Meetings
lara
56
6.6k
KATA
mclloyd
32
15k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Mobile First: as difficult as doing things right
swwweet
224
10k
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の特徴的な プログラムを書くことはほとんどできない。 • オブジェクトモデルに手を加えたり、クラスを再オープンしたり、メソッドを動的に定義した り、ブロックでスコープを管理したりすることを、言語があなたに期待している。 •
『メタプログラミングはただのプログラミング』