在编写声明性 ( 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)