我正在尝试使用std::collections::BinaryHeap自定义结构。为此,我必须让我的结构实现std::cmp::Ord特征,但我需要的是 2 个BinaryHeap相同的结构,但顺序不同。
有没有办法定义 2 个 Ord 实现并选择使用哪个Ord,或者其他一些方法来指定替代排序?
我想我可以定义 2 个不同的包装结构,它们保留对原始自定义结构的引用,并Ord为每个结构提供一个实现,但是必须构造潜在的大量此类包装结构的实例似乎很浪费。
在 Pyhton/Java 中,我会提供一个排序功能/比较器,但似乎没有这样的功能。在 Scala 中,我可以定义一个仅编译时类型来选择正确的隐式排序实现;感觉 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
}
Run Code Online (Sandbox Code Playgroud)
如果您想要不同的行为,则BinaryHeap必须只使用包装类型,但是,包装类型并不浪费,因为没有额外的间接或内存使用,struct Foo { data: T }并且T除了标称类型名称之外(无论是什么类型T) ,包装类型都是相同的。