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

3

在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`)

你能否编辑你的问题,解释一下为什么你的例子是“不工作的”?(在 https://play.rust-lang.org/?gist=9f89d79b921d6036998e2cabc267c740 上看起来它是可以工作的) - Shepmaster
在问题中注意到错误。 - ideasman42
你是否点击了我的第二个链接以显示你的第二个宏以及它可以工作的事实?你能否编辑你的问题以展示你如何调用第二个宏,从而导致它失败?也许你甚至可以在Rust Playground上创建一些完全重现错误的东西?当在Stack Overflow上提问时,创建[MCVE]是百分之百被期望的。 - Shepmaster
1个回答

5

是的,你只是缺少一个额外的括号来包含表达式。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接