struct Foo{
value: i32
}
impl Foo{
fn get_and_change_value(&mut self) -> i32{
let v = self.value;
self.value = 42;
v
}
}
//glue_code_macro
fn main(){
let mut f1 = Foo{value:1};
let mut f2 = Foo{value:2};
let mut f3 = Foo{value:3};
let v: Vec<i32> = glue_code_macro!(f1,f2,f3);
}
我想创建glue_code_macro
,其中包含n
个变量并创建一个向量。我不认为我可以通过正常的功能实现这一点,因为我有一个可变的引用,我将无法更改其内容。
在我脑海中,它会扩展到
let v = {
let v1 = f1.get_and_change_value();
let v2 = f2.get_and_change_value();
let v3 = f3.get_and_change_value();
vec!(v1,v2,v3)
}
这可能吗?如果是,我该怎么做?
答案 0 :(得分:3)
这是可能的。将其添加到模块顶部:
#![feature(macro_rules)]
macro_rules! glue_code_macro(
($($element:ident),*) => (
vec![$($element.get_and_change_value(),)*]
)
)
宏指南解释了它的工作原理:http://doc.rust-lang.org/guide-macros.html