代码之家  ›  专栏  ›  技术社区  ›  Rob

如何通过结构相等性检查结构集合中的结构?

  •  0
  • Rob  · 技术社区  · 6 年前

    如果我有一个结构:

    pub struct Test {
        val1: u8,
        val2: u8,
    }
    

    我做了一个 vec! 诸如此类:

    let a = Test{val1: 1, val2: 1};
    let b = Test{val1: 1, val2: 2};
    let c = Test{val1: 1, val2: 2};
    let my_vec = vec![a, b];
    

    我怎么知道 my_vec 包含与C值相同的结构?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Peter Hall    6 年前

    Vec 有一个方法, contains ,用于检查它是否包含特定值。该方法要求元素实现 PartialEq ,您可以这样自动派生:

    #[derive(PartialEq)]
    pub struct Test {
        val1: u8,
        val2: u8,
    }
    

    现在你可以做:

    assert!(my_vec.contains(&c));
    

    如果集合变大,这将非常低效,因为它必须与每个元素进行比较,直到找到匹配的元素为止。一 HashSet 会更有效率,但有它自己的需求,你需要实现 Eq Hash 也是。幸运的是,这些通常可以以相同的方式派生。

        2
  •  1
  •   Rob    6 年前

    如中所述,您需要执行partialeq和eq方法。 https://doc.rust-lang.org/std/cmp/trait.PartialEq.html

    pub struct Test {
        val1: u8,
        val2: u8,
    }
    
    impl PartialEq for Test {
        fn eq(&self, other: &Test) -> bool {
            self.val1 == other.val1 && self.val2 == other.val2
        }
    }
    
    fn main() {
        let a = Test{val1: 1, val2: 1};
        let b = Test{val1: 1, val2: 2};
        let c = Test{val1: 1, val2: 2};
        let my_vec = vec!(a, b);
    
        println!("{}", my_vec.contains(&c));
    }