Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
470
LINEボットを作ってみよう
yokoto
0
48
Other Decks in Programming
See All in Programming
Patterns of Patterns
denyspoltorak
0
340
マスタデータ問題、マイクロサービスでどう解くか
kts
0
130
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
1.7k
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
390
実はマルチモーダルだった。ブラウザの組み込みAI🧠でWebの未来を感じてみよう #jsfes #gemini
n0bisuke2
3
1.3k
TerraformとStrands AgentsでAmazon Bedrock AgentCoreのSSO認証付きエージェントを量産しよう!
neruneruo
4
1.8k
tparseでgo testの出力を見やすくする
utgwkk
2
280
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
7
2.3k
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
140
Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)
uki00a
0
160
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
190
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
300
Featured
See All Featured
The SEO Collaboration Effect
kristinabergwall1
0
310
How GitHub (no longer) Works
holman
316
140k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
290
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
1.8k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
45
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Building Adaptive Systems
keathley
44
2.9k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1k
HDC tutorial
michielstock
0
270
Believing is Seeing
oripsolob
0
15
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
230
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の特徴的な プログラムを書くことはほとんどできない。 • オブジェクトモデルに手を加えたり、クラスを再オープンしたり、メソッドを動的に定義した り、ブロックでスコープを管理したりすることを、言語があなたに期待している。 •
『メタプログラミングはただのプログラミング』