如何针对给定类型 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
是什么类型)。
我正在尝试将 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
是什么类型)。