是否可以在 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 + CloneV: 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
    }
}

Playground