21章マクロ
cento(「パッチワーク」を意味するラテン語由来)は、他の詩作者の作品からの引用だけで構成される詩である。
−Matt Madden†1
[†1] 訳注:米国の漫画家、作家。この文章は、『99 Ways to Tell a Story: Exercises in Style』からの引用。
Rustはマクロ(macro)機能をサポートしている。関数だけではできないような言語拡張が、マクロでなら実現できる。例えば既に紹介した、テストに便利なassert_eq!
は、マクロで実現されている。
assert_eq!(gcd(6, 10), 2);
このようなことはジェネリック関数で書けなくはないが、assert_eq!
マクロには、関数では決して実現できない機能がいくつかある。その1つは、アサーションが失敗した際に、ファイル名と行番号を含んだエラーメッセージを出力することだ。関数で、この種の情報を得ることはできない。マクロでこれができるのは、関数とマクロでは動作機構がまったく異なるからだ。
マクロはある種の短縮記法だ。コンパイルの際に、型チェックより前に、そして機械コードの生成よりもずっと前の段階で、マクロ呼び出しは展開される。すなわち、何らかのRustコードに置き換えられる。上のマクロを展開するとおおよそ下のようになる。
match (&gcd(6, 10), &2) { (left_val, right_val) => { if !(*left_val == *right_val) { panic!("assertion failed: `(left == right)`, \ (left: `{:?}`, right: `{:?}`)", left_val, right_val); ...
Get プログラミングRust 第2版 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.