是否可以在 Rust 中组合类型约束?
Is it possible to combine type constraints in Rust?
我一直在使用相当多的静态类型编程语言(C++、Haskell、...),但对 Rust 比较陌生。
我经常这样写代码:
struct LeafNode<K: Ord + Default + Clone, V: Default + Clone> {
keys: Vec<K>,
values: Vec<V>,
}
impl <K: Ord + Default + Clone, V: Default + Clone> LeafNode<K, V> {
// ...
}
类型约束这里有很多重复。
当 LeafNode
用于其他内容时(例如,在构建节点树时),情况会更加复杂。
每当这些约束之一在实施过程中发生变化时,就会有很多地方需要更改代码,因为它们在许多不同的 struct
定义和 impl
块中被命名。
有没有办法从 K: Ord + Default + Clone
和 V: Default + Clone
创建某种 'type constraint alias'?
如果它存在,它可能有一些我不知道的名字,这使得搜索这种技术非常困难。因此这个问题。
您可以通过创建自己的特征来实现此目的,该特征将其他特征作为界限,然后为其添加一揽子实现:
trait MyConstraint: Ord + Default + Clone {}
impl <T: Ord + Default + Clone> MyConstraint for T {}
struct LeafNode<K: MyConstraint> {
keys: Vec<K>
}
impl<K: MyConstraint> LeafNode<K> {
fn keys(&self) -> &[K] {
&self.keys
}
}
作为补充答案。
可以使用trait alias(目前不稳定):
#![feature(trait_alias)]
trait MyConstraint = Ord + Default + Clone;
struct LeafNode<K: MyConstraint> {
keys: Vec<K>
}
impl<K: MyConstraint> LeafNode<K> {
fn keys(&self) -> &[K] {
&self.keys
}
}
我一直在使用相当多的静态类型编程语言(C++、Haskell、...),但对 Rust 比较陌生。
我经常这样写代码:
struct LeafNode<K: Ord + Default + Clone, V: Default + Clone> {
keys: Vec<K>,
values: Vec<V>,
}
impl <K: Ord + Default + Clone, V: Default + Clone> LeafNode<K, V> {
// ...
}
类型约束这里有很多重复。
当 LeafNode
用于其他内容时(例如,在构建节点树时),情况会更加复杂。
每当这些约束之一在实施过程中发生变化时,就会有很多地方需要更改代码,因为它们在许多不同的 struct
定义和 impl
块中被命名。
有没有办法从 K: Ord + Default + Clone
和 V: Default + Clone
创建某种 'type constraint alias'?
如果它存在,它可能有一些我不知道的名字,这使得搜索这种技术非常困难。因此这个问题。
您可以通过创建自己的特征来实现此目的,该特征将其他特征作为界限,然后为其添加一揽子实现:
trait MyConstraint: Ord + Default + Clone {}
impl <T: Ord + Default + Clone> MyConstraint for T {}
struct LeafNode<K: MyConstraint> {
keys: Vec<K>
}
impl<K: MyConstraint> LeafNode<K> {
fn keys(&self) -> &[K] {
&self.keys
}
}
作为补充答案。
可以使用trait alias(目前不稳定):
#![feature(trait_alias)]
trait MyConstraint = Ord + Default + Clone;
struct LeafNode<K: MyConstraint> {
keys: Vec<K>
}
impl<K: MyConstraint> LeafNode<K> {
fn keys(&self) -> &[K] {
&self.keys
}
}