是否可以在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`)
答案 0 :(得分:4)
是的,您只是缺少一组额外的大括号来包含表达式。
macro_rules! squared {
($x:expr) => {{
let y = $x;
y * y
}}
}
请注意,此宏仅适用于具有实现Copy
的类型的表达式。