如何通过结构相等检查结构集合中的结构?
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
会更有效率,但它有自己的要求,您也需要实现 Eq
和 Hash
。幸运的是,这些通常可以用相同的方式推导出来。
如果我有一个结构:
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
会更有效率,但它有自己的要求,您也需要实现 Eq
和 Hash
。幸运的是,这些通常可以用相同的方式推导出来。