为什么我不能访问在宏中声明的变量,除非我传入变量名?
Why can I not access a variable declared in a macro unless I pass in the name of the variable?
我有这个宏:
macro_rules! set_vars {
( $($x:ident),* ) => {
let outer = 42;
$( let $x = outer; )*
}
}
扩展此调用:
set_vars!(x, y, z);
变成我期望的(来自--pretty=expanded
):
let outer = 42;
let x = outer;
let y = outer;
let z = outer;
在随后的代码中我可以打印x
、y
和z
就好了,但是outer
似乎是未定义的:
error[E0425]: cannot find value `outer` in this scope
--> src/main.rs:11:5
|
11 | outer;
| ^^^^^ not found in this scope
如果我将 outer
变量作为显式宏参数传递,我可以访问它。
这是故意的吗,跟"macro hygiene"有关?如果是这样,那么以某种特殊方式在 --pretty=expanded
中标记此类 "internal" 变量可能有意义吗?
是的,这就是宏观卫生。在宏内声明的标识符在宏外不可用(反之亦然)。 Rust 宏不是 C 宏(也就是说,Rust 宏不仅仅是美化的文本替换)。
另请参阅:
我有这个宏:
macro_rules! set_vars {
( $($x:ident),* ) => {
let outer = 42;
$( let $x = outer; )*
}
}
扩展此调用:
set_vars!(x, y, z);
变成我期望的(来自--pretty=expanded
):
let outer = 42;
let x = outer;
let y = outer;
let z = outer;
在随后的代码中我可以打印x
、y
和z
就好了,但是outer
似乎是未定义的:
error[E0425]: cannot find value `outer` in this scope
--> src/main.rs:11:5
|
11 | outer;
| ^^^^^ not found in this scope
如果我将 outer
变量作为显式宏参数传递,我可以访问它。
这是故意的吗,跟"macro hygiene"有关?如果是这样,那么以某种特殊方式在 --pretty=expanded
中标记此类 "internal" 变量可能有意义吗?
是的,这就是宏观卫生。在宏内声明的标识符在宏外不可用(反之亦然)。 Rust 宏不是 C 宏(也就是说,Rust 宏不仅仅是美化的文本替换)。
另请参阅: