我正在尝试将std::collections::BinaryHeap
与自定义结构一起使用。为了做到这一点,我必须让我的结构实现std::cmp::Ord
特性,但我需要的是2 BinaryHeap
个相同结构但排序不同。
有没有办法定义2个Ord实现&选择使用哪个Ord
,或者用其他方式指定备用排序?
我想我可以定义2个不同的包装结构,它们保留对原始自定义结构的引用,并为每个结构都有Ord
的实现,但是构建潜在的大量实例似乎相当浪费这种包裹结构。
在Pyhton / Java中,我提供了一个排序函数/比较器,但似乎没有这样的设施。在Scala中,我可以定义一个仅编译时的类型来选择正确的隐式Ordering实现;感觉Rust支持类似的东西,但我还没能解决它。
答案 0 :(得分:2)
对于单一类型,没有办法对同一特征进行两种不同的实现,例如:这个假设的方案不工作
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 }
和{{1除了名义类型名称(无论T
是什么类型),它们都是相同的。