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

时间:2016-08-07 09:02:55

标签: macros rust

是否可以在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`)

1 个答案:

答案 0 :(得分:4)

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

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

请注意,此宏仅适用于具有实现Copy的类型的表达式。