我想遍历结构中的集合类型并删除一些值。但是生锈阻止了我破坏收藏:
fn some_method(&mut self) {
self.collection = self.collection.into_iter()
.filter(...)
.collect();
}
原因是我可以克隆所有值以构建另一个集合,但这效率不高。在Rust中修改字段的惯用方式是什么?
完整的示例(也包含into_iter):
#[derive(Debug)]
struct Scores {
collection: Vec<i32>,
}
impl Scores {
fn new() -> Scores {
return Scores {
collection: Vec::new(),
};
}
fn filter_in_above_50(&mut self) {
self.collection = self
.collection
.drain(..)
.filter(|score| score > &50)
.collect();
}
fn filter_in_above_50_using_into_iter(&mut self) {
let coll : &mut Vec<i32> = self.collection.as_mut();
let coll : Vec<i32> = coll
.into_iter()
.filter(|score| score > &&mut 50i32)
.map(|&mut x| x)
.collect();
self.collection = coll;
}
}
和测试:
#[test]
fn score_test() {
let mut s = Scores::new();
s.collection.push(199);
s.collection.push(11);
s.filter_in_above_50();
assert_eq!(s.collection, vec![199]);
}
#[test]
fn score_test_using_into_iter() {
let mut s = Scores::new();
s.collection.push(199);
s.collection.push(11);
s.filter_in_above_50_using_into_iter();
assert_eq!(s.collection, vec![199]);
}
完整示例:
#[derive(Debug)]
struct Scores {
collection: Vec<i32>,
}
impl Scores {
fn new() -> Scores {
return Scores {
collection: Vec::new(),
};
}
fn filter_in_above_50(&mut self) {
self.collection = self
.collection
.drain(..)
.filter(|score| score > &50)
.collect();
}
}
和测试:
#[test]
fn score_test() {
let mut s = Scores::new();
s.collection.push(199);
s.collection.push(11);
s.filter_in_above_50();
assert_eq!(s.collection, vec![199]);
}