我想创建一个宏,它将作为参数const business = this.state.business ? this.state.business : [];
。宏应将变量($var:ident, $val:expr)
设置为$var
的值,克隆它,然后返回克隆。这是我的尝试:
$val
它不起作用,因为macro_rules! my_macro {
($var:ident, $val:expr) => {{
let $var = $val;
$var.clone()
}}
}
fn main() {
println!("{}", my_macro!(x, 5));
println!("{}", x);
}
语句在块内。如果我尝试通过将let
更改为{{
来解决问题,则会产生语法错误。有什么方法可以解决这个问题吗?
答案 0 :(得分:5)
没有
宏不是魔术,它们只是扩展为您自己可以自己编写的单个表达式/声明/项目。没有办法编写一个“转义”它所定义范围的变量声明。
答案 1 :(得分:0)
这是不可能的,因为Rust有hygienic macros,记录为here。
宏观卫生cannot be disabled currently,但可以在Macros 2.0中成为:
[]当用户希望宏def的名称为“escape”时,实现“卫生弯曲”。
答案 2 :(得分:0)
这里有一种方法可以做到这一点......
#[macro_export]
macro_rules! create_var {
($name:ident, $val:expr) => {
let $name = $val;
}
}
fn main() {
create_var!(test, 42);
println!("{}",test);
}
输出:
42