是否可以在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的类型的表达式。

08-19 10:27