Macros 是否可以在具有单个实例的Rust宏中多次使用参数?

Macros 是否可以在具有单个实例的Rust宏中多次使用参数?,macros,rust,Macros,Rust,是否可以在Rust宏中多次使用参数,只实例化一次参数 举个简单的例子: macro_rules! squared { ($x:expr) => { $x * $x } } 当这起作用时,如果像squared这样调用!(some_function()+1),该函数将被多次调用。有没有办法避免这种情况 非工作示例: macro_rules! squared { ($x:expr) => { let y = $x;

是否可以在Rust宏中多次使用参数,只实例化一次参数

举个简单的例子:

macro_rules! squared {
    ($x:expr) => {
        $x * $x
    }
}
当这起作用时,如果像
squared这样调用!(some_function()+1)
,该函数将被多次调用。有没有办法避免这种情况

非工作示例:

macro_rules! squared {
    ($x:expr) => {
        let y = $x;
        y * y
    }
}
给出一个编译错误:

 error: expected expression, found statement (`let`)

是的,只是缺少一组额外的大括号来包含表达式

macro_rules! squared {
    ($x:expr) => {{
        let y = $x;
        y * y
    }}
}

请注意,此宏仅适用于具有实现
Copy

类型的表达式。您能否回答问题以解释示例“不工作”的原因。注意到问题中的错误。您是否单击了显示第二个宏及其工作原理的“我的第二个链接”?你能回答你的问题来说明你是如何调用第二个宏的,以至于它失败的吗?也许你甚至可以完全复制错误?在询问堆栈溢出问题时,100%希望您创建一个。