移动时如何自动清除结构中的属性?

时间:2015-04-01 12:12:10

标签: rust

我有一个结构

struct Test {
    list: Vec<u64>
}

以及我希望获取向量和擦除列表字段以清空Vec

的方法
fn get_list(&self) -> Vec<u64> {
    let list = Vec::new();
    for item in self.list.drain() {
        list.push(item);
    }
    list
}

还有另一种做法吗?像移动值上的autoreinit字段,例如:

fn get_list(&self) -> ???<Vec<u64>> {
    self.list
}

2 个答案:

答案 0 :(得分:2)

这是解决方案,你可以在Rust操场上测试(遗憾的是,分享按钮对我不起作用)。

use std::mem;

#[derive(Debug)]
struct Test {
   list: Vec<u64>
}

impl Test {

    fn get_list(&mut self) -> Vec<u64> {
       let repl = mem::replace(&mut self.list, Vec::new());
       repl
    }

}

fn main() {
    let mut r = Test {
       list : vec![1,2,3]
    };
    print!("r : {:?} ", r);
    print!("replace : {:?} ", r.get_list());
    print!("r : {:?} ", r);
}

您只需要在可变值上运行mem::replacedocs)并将其替换为将在其位置移动的值。在这种情况下,我们的目的地为self.list,我们正在替换它的值为空Vec

注意事项:

  • 测试的字段self.list需要被视为&mut self.list
  • 之前的更改意味着self也应该是可变的。
  • 移动第二个替换参数。这意味着在此次通话后它将无法继续使用。这通常意味着什么,你要么传递一个Vec构造函数(例如Vec::new()),要么克隆正在替换的值。

答案 1 :(得分:-1)

来自#rust IRC

&LT;主题&GT; jiojiajiu,http://doc.rust-lang.org/nightly/std/mem/fn.replace.html