如何针对给定类型 select 不同的 std::cmp::Ord (或其他特征)实现?

How do I select different std::cmp::Ord (or other trait) implementations for a given type?

我正在尝试将 std::collections::BinaryHeap 与自定义结构一起使用。为此,我必须让我的结构实现 std::cmp::Ord 特性,但我需要的是 2 个相同结构但顺序不同的 BinaryHeap

有没有一种方法可以定义 2 个 Ord 实现并选择使用哪个 Ord,或者其他一些方法来指定替代顺序?

我想我可以定义 2 个不同的包装结构,它们保留对原始自定义结构的引用,并为每个结构实现 Ord,但是必须构造很多可能很浪费此类包装结构的实例。

在 Pyhton/Java 中,我会提供排序 function/Comparator,但似乎没有这样的工具。在 Scala 中,我可以定义一个仅编译时类型 select 正确的隐式排序实现;感觉 Rust 支持类似的东西,但我一直无法解决它。

无法对同一个类型的同一特征进行两种不同的实现,例如这个假设的方案行得通

struct MyType { ... }
mod foo {
    impl Ord for MyType { ... } // A

    // everything in here uses the A implementation
}
mod bar {
    impl Ord for MyType { ... } // B

    // everything in here uses the B implementation
}

如果你想要 BinaryHeap 的不同行为,你必须只使用包装类型,但是,包装类型并不浪费,因为没有额外的间接寻址或内存使用,struct Foo { data: T }T 相同,除了标称类型名称(无论 T 是什么类型)。