我正在try 创建一个 struct

struct Obj {
    id: i32,
    value: i64,
}

可以用在BinaryHeapHashSet上.

当与BinaryHeap一起使用时,我希望它是基于value订购的. 当与HashSet一起使用时,我希望它与id一起散列.

这两种方法都需要Eq特征的实现,但我找不到一种方法来实现Eq的两种不同实现.

我发现最接近的是Multiple implementations for the same trait of the same type in Rust,但这似乎只有在特征接受泛型参数的情况下才有效,而Eq不是这种情况

推荐答案

Do not do this.在Rust HashEq中,实现必须彼此一致.Hash个性状的记录特别写道:

同时实现Hash和Eq时,重要的是满足以下属性:

k1 == k2 -> hash(k1) == hash(k2)

换句话说,如果两个键相等,则它们的散列也必须相等.HashMap和HashSet都依赖于此行为.

值得庆幸的是,在使用#[Derate(PartialEq,Eq,Hash)]派生Eq和Hash时,您不需要担心维护此属性.

Violating this property is a logic error.未指定逻辑错误导致的行为,但特征的用户必须确保此类逻辑错误不会导致未定义的行为.这意味着不安全的代码不能依赖于这些方法的正确性.

使用newtype模式创建以不同方式实现HashEq的两个类型,并将它们用作HashMapBinaryHeap的元素.

struct Obj {
    id: i32,
    value: i64,
}

// implement `Hash` that will hash `self.0.id`.
struct ObjHash(Obj);

// implement `Eq` that will compare `self.0.value`.
struct ObjEq(Obj);

fn foo() {
    let hash_map: HashMap<ObjHash> = todo!();
    let bin_heap: BinaryHeap<ObjEq> = todo!();
}

Rust相关问答推荐

如何将元素添加到向量并返回对该元素的引用?

rust 迹-内存管理-POP所有权-链表

类型批注需要静态生存期

在0..1之间将U64转换为F64

无符号整数的Rust带符号差

在macro_rule中拆分模块和函数名

失真图像图形捕获Api

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

如何迭代存储在 struct 中的字符串向量而不移动它们?

为什么需要静态生命周期以及在处理 Rust 迭代器时如何缩小它?

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

使用 lalrpop 在 rust 中解析由 " 引用的字符串

在 Rust 中,我如何处理请求 javascript 的页面?

rust tokio::spawn 在 mutexguard 之后等待

仅当满足外部条件时如何添加到 actix web 的路由

如何使用 rust bindgen 生成的 std_vector

是否有适当的方法在参考 1D 中转换 2D 数组

提取 struct 生成宏中字段出现的索引

有没有办法使用 NASM 语法进行内联汇编?

在 macro_rules 中转义 $ 美元符号