相关疑难解决方法(0)

如何在程序宏生成的代码中创建卫生标识符?

在编写声明性 ( macro_rules!) 宏时,我们会自动获得宏卫生。在这个例子中,我声明了一个f在宏中命名的变量并传入一个标识符f,该标识符成为一个局部变量:

macro_rules! decl_example {
    ($tname:ident, $mname:ident, ($($fstr:tt),*)) => {
        impl std::fmt::Display for $tname {
            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
                let Self { $mname } = self;
                write!(f, $($fstr),*)
            }
        }
    }
}

struct Foo {
    f: String,
}

decl_example!(Foo, f, ("I am a Foo: {}", f));

fn main() {
    let f = Foo {
        f: "with a member named `f`".into(),
    };
    println!("{}", f);
}
Run Code Online (Sandbox Code Playgroud)

这段代码可以编译,但是如果查看部分展开的代码,您会发现存在明显的冲突:

impl std::fmt::Display …
Run Code Online (Sandbox Code Playgroud)

macros hygiene rust rust-proc-macros

8
推荐指数
2
解决办法
1643
查看次数

标签 统计

hygiene ×1

macros ×1

rust ×1

rust-proc-macros ×1