创建具有无限参数的宏

时间:2014-08-07 14:49:06

标签: rust

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)
}

这可能吗?如果是,我该怎么做?

1 个答案:

答案 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