我有一个结构
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
}
答案 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::replace
(docs)并将其替换为将在其位置移动的值。在这种情况下,我们的目的地为self.list
,我们正在替换它的值为空Vec
。
注意事项:
self.list
需要被视为&mut self.list
。 self
也应该是可变的。Vec::new()
),要么克隆正在替换的值。答案 1 :(得分:-1)
来自#rust IRC
&LT;主题&GT; jiojiajiu,http://doc.rust-lang.org/nightly/std/mem/fn.replace.html