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宏不仅仅是美化的文本替换)

另见:


有办法绕过它吗?@ArtyomGevorgyan我不知道;在那种情况下,请输入名称。
let outer = 42;
let x = outer;
let y = outer;
let z = outer;