为什么我不能访问在宏中声明的变量,除非我传入变量名?

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;

在随后的代码中我可以打印xyz就好了,但是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 宏不仅仅是美化的文本替换)。

另请参阅: