マクロの定義側と利用側で識別子を共有する方法について。
マクロの定義側と利用側では、識別子のための空間が異なる。
これにより、定義側も利用側も識別子の衝突を気にせずにコーディングできる。
逆に、識別子を共有したい場合、識別子の名前をキャプチャ ($
に続く識別子) で導入する。
以下では、マクロ with_var_x
の定義側と利用側で識別子 x
を共有していない。
macro_rules! with_var {
($block:block) => {
let x = "hello";
$block
}
}
fn main() {
with_var!({ println!("{x}") });
}
error[E0425]: cannot find value `x` in this scope --> src/main.rs:9:28 | 9 | with_var!({ println!("{x}") }); | ^ not found in this scope
以下では、マクロ with_var
の定義側と利用側で識別子 x
を共有している。
macro_rules! with_var {
($var:ident $block:block) => {
let $var = "hello";
$block
}
}
fn main() {
with_var!(x { println!("{x}") });
}