gpt4 book ai didi

rust - PartialEq和PartialOrd表示未返回正确的输出

转载 作者:行者123 更新时间:2023-12-03 11:32:31 26 4
gpt4 key购买 nike

我已经为我的结构实现了PartialEqPartialOrd,所以我可以使用一些自定义逻辑为这些结构创建BTreeSet:如果该结构中的名称字段等于另一个结构的名称字段,则一个结构相等。当我查找此结构中的某个结构时,如果整个结构都在该集合中而不仅仅是名称字段,则仅返回true。如何解决这个问题,以便两个断言都返回true?
Playground link

use std::cmp::Ordering;
use std::collections::BTreeSet;


#[derive(Debug, Eq, Hash, Ord)]
struct Obj {
name: String,
count: i64,
}

impl PartialEq for Obj {
fn eq(&self, other: &Self) -> bool {
self.name == other.name
}
}

impl PartialOrd for Obj {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.name.cmp(&other.name))
}
}

fn vec_to_set(v: &[&str]) -> BTreeSet<Obj> {
let hs: BTreeSet<Obj> = v
.iter()
.map(|d| {
let mut count = 1;
if d.to_string() == "C".to_string() {
count = 2;
};

Obj {
name: d.to_string(),
count,
}
})
.collect();
hs
}

fn main() {
let v = vec!["A", "B", "C", "A"];

let hs = vec_to_set(&v);
let t1 = Obj {
name: "A".to_string(),
count: 1,
};
let t2 = Obj {
name: "A".to_string(),
count: 10,
};
assert!(hs.contains(&t1)); // true
assert!(hs.contains(&t2)); // false
}

最佳答案

您不能手动实现PartialOrdPartialEq并派生Ord。不同的实现必须彼此一致,并且默认生成的Ord实现与您的手动实现不同。
如果您将#[derive(Ord)]替换为

impl Ord for Obj {
fn cmp(&self, other: &Self) -> Ordering {
self.name.cmp(&other.name)
}
}
您的程序按预期工作。
但是,在派生 Eq时,您可以派生 PartialEq,因为 Eq只是一个标记特征,因此其派生实现与您的不矛盾。
Hash的派生实现也与 PartialEq的手动实现不同。 BTreeSet不使用 Hash,但 HashMapHashSet都使用,并且它们与派生的 Hash impl也会一起表现不佳。

关于rust - PartialEq和PartialOrd表示未返回正确的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64956721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com