Rust:如何就地修改集合类型的struct字段?

问题描述 投票:0回答:1

我想遍历结构中的集合类型并删除一些值。但是生锈阻止了我破坏收藏:

fn some_method(&mut self) {
  self.collection = self.collection.into_iter()
   .filter(...)
   .collect();
}

原因是我可以克隆所有值以构建另一个集合,但这效率不高。在Rust中修改字段的惯用方式是什么?

rust
1个回答
1
投票

完整的示例(也包含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]);
}

0
投票

完整示例:

#[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]);
}
© www.soinside.com 2019 - 2024. All rights reserved.