Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ひとりメタプログラミングRuby勉強会
Search
yokoto
July 16, 2021
Programming
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ひとりメタプログラミングRuby勉強会
yokoto
July 16, 2021
More Decks by yokoto
See All by yokoto
エキスパートRails基礎
yokoto
1
520
LINEボットを作ってみよう
yokoto
0
60
Other Decks in Programming
See All in Programming
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
2.3k
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.2k
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
1
300
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
16
8.9k
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
150
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
300
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
340
Rails初心者がパスキーを実装してみて大変だったこと
ktombow
0
160
AI時代のIaC入門 〜なぜインフラをコードで管理したいのか?〜 / Introduction to IaC in the AI Era
akihisaikeda
6
1.5k
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
140
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.7k
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
130
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
450
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
23k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
300
The Curse of the Amulet
leimatthew05
3
17k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
70
68k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
300
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Designing for Timeless Needs
cassininazir
1
560
New Earth Scene 8
popppiees
4
2.8k
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の特徴的な プログラムを書くことはほとんどできない。 • オブジェクトモデルに手を加えたり、クラスを再オープンしたり、メソッドを動的に定義した り、ブロックでスコープを管理したりすることを、言語があなたに期待している。 •
『メタプログラミングはただのプログラミング』