有没有办法为多个特征创建一个类型别名?

时间:2014-09-27 01:59:47

标签: rust

我有一个通用函数,可以打印最少两个项目:

use std::fmt::Display;

fn print_min<T: PartialOrd + Display>(a: &T, b: &T) {
    println!("min = {}", if a < b { a } else { b });
}

这适用于同时实现PartialOrdDisplay特征的任何内容:

print_min(&45, &46);
// min = 45
print_min(&"a", &"b");
// min = a

必须将PartialOrd + Display放在函数定义中是有点难看,特别是如果我想拥有一大堆对此进行操作的函数(例如,实现二进制搜索树),或者如果我边界变得更加复杂。我的第一个倾向是尝试写一个类型别名:

type PartialDisplay = PartialOrd + Display;

但这给了我一些相当奇怪的编译器错误:

error[E0393]: the type parameter `Rhs` must be explicitly specified
 --> src/main.rs:7:23
  |
7 | type PartialDisplay = PartialOrd + Display;
  |                       ^^^^^^^^^^ missing reference to `Rhs`
  |
  = note: because of the default `Self` reference, type parameters must be specified on object types

error[E0225]: only auto traits can be used as additional traits in a trait object
 --> src/main.rs:7:36
  |
7 | type PartialDisplay = PartialOrd + Display;
  |                                    ^^^^^^^ non-auto additional trait

我猜我的语法错了或者这还不可能。我喜欢像

这样的东西
type PartialDisplay = ???
fn print_min<T: PartialDisplay> { /* ... */ }

2 个答案:

答案 0 :(得分:19)

PartialOrdDisplay是特征。 has been discussed如何实现别名,但决定不需要它。

相反,您可以使用您想要的特征创建一个新的特征作为超级特征,并提供一揽子实施:

use std::fmt::Display;

trait PartialDisplay: PartialOrd + Display {}
impl<T: PartialOrd + Display> PartialDisplay for T {}

fn print_min<T: PartialDisplay>(a: &T, b: &T) {
    println!("min = {}", if a < b { a } else { b });
}

fn main() {
    print_min(&45, &46);
    print_min(&"aa", &"bb");
}

答案 1 :(得分:7)

RFC 1733引入了特质别名的概念。当it is implemented时,您可以说:

trait PartialDisplay = PartialOrd + Display;