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