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
480
LINEボットを作ってみよう
yokoto
0
49
Other Decks in Programming
See All in Programming
Gemini for developers
meteatamel
0
100
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
210
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
230
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
630
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
460
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
250
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
4k
dchart: charts from deck markup
ajstarks
3
1k
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
Featured
See All Featured
For a Future-Friendly Web
brad_frost
182
10k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
440
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
780
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
79
Mind Mapping
helmedeiros
PRO
0
90
A better future with KSS
kneath
240
18k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
150
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の特徴的な プログラムを書くことはほとんどできない。 • オブジェクトモデルに手を加えたり、クラスを再オープンしたり、メソッドを動的に定義した り、ブロックでスコープを管理したりすることを、言語があなたに期待している。 •
『メタプログラミングはただのプログラミング』