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

Cas*_*par 5 rust

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

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

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

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

huo*_*uon 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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,严格来说,结构的布局没有指定,但是对单字段枚举没有任何明智的更改:如果只有一个字段,则重新排序字段不会执行任何操作。(我想编译器可以插入不必要的前导填充或其他东西,但这有点奇怪。也许作为模糊“不安全”代码的工具?)基于迭代器的“map”不会优化方式,“map_in_place”有有机会,但我还没有检查过(机会很小)。 (2认同)