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

How to check for a struct in a collection of structs, by structural equality?

如果我有一个结构:

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 具有相同值的结构?

您需要实现 https://doc.rust-lang.org/std/cmp/trait.PartialEq.html

中所述的 PartialEq 和 eq 方法
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));
}

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

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

现在你可以做:

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

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