Macros 为什么我不能访问宏中声明的变量,除非我传入变量的名称?
我有一个宏:Macros 为什么我不能访问宏中声明的变量,除非我传入变量的名称?,macros,rust,rust-macros,Macros,Rust,Rust Macros,我有一个宏: macro_rules! set_vars { ( $($x:ident),* ) => { let outer = 42; $( let $x = outer; )* } } 这将扩展此调用: set_vars!(x, y, z); 进入我的预期(从--pretty=ex
macro_rules! set_vars {
( $($x:ident),* ) => {
let outer = 42;
$( let $x = outer; )*
}
}
这将扩展此调用:
set_vars!(x, y, z);
进入我的预期(从--pretty=expanded
):
在随后的代码中,我可以打印x
、y
和z
很好,但是outer
似乎没有定义:
错误[E0425]:在此范围内找不到值'outer'
-->src/main.rs:11:5
|
11 |外部;
|在此作用域中找不到^
如果将outer
变量作为显式宏参数传递,则可以访问该变量
这是故意的,与“宏观卫生”有关吗?如果是这样,那么在--pretty=expanded
中用某种特殊的方式标记这样的“内部”变量可能是有意义的 是的,这是宏观卫生。宏内声明的标识符在宏外不可用(反之亦然)。Rust宏不是C宏(也就是说,Rust宏不仅仅是美化的文本替换)
另见:
let outer = 42;
let x = outer;
let y = outer;
let z = outer;