如何为给定类型选择不同的std :: cmp :: Ord(或其他特征)实现?

时间:2015-02-28 05:41:41

标签: rust

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

有没有办法定义2个Ord实现&选择使用哪个Ord,或者用其他方式指定备用排序?

我想我可以定义2个不同的包装结构,它们保留对原始自定义结构的引用,并为每个结构都有Ord的实现,但是构建潜在的大量实例似乎相当浪费这种包裹结构。

在Pyhton / Java中,我提供了一个排序函数/比较器,但似乎没有这样的设施。在Scala中,我可以定义一个仅编译时的类型来选择正确的隐式Ordering实现;感觉Rust支持类似的东西,但我还没能解决它。

1 个答案:

答案 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是什么类型),它们都是相同的。