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

Rust 有没有办法为多个特征创建类型别名?,rust,Rust,我有一个通用函数,它至少打印两项: use std::fmt::Display; fn print_min<T: PartialOrd + Display>(a: &T, b: &T) { println!("min = {}", if a < b { a } else { b }); } 必须在函数定义中添加PartialOrd+Display,这有点难看,特别是如果我想有一大堆函数在此基础上运行(例如,实现二元搜索树),或者如果我的边界变得更复杂

我有一个通用函数,它至少打印两项:

use std::fmt::Display;

fn print_min<T: PartialOrd + Display>(a: &T, b: &T) {
    println!("min = {}", if a < b { a } else { b });
}
必须在函数定义中添加
PartialOrd+Display
,这有点难看,特别是如果我想有一大堆函数在此基础上运行(例如,实现二元搜索树),或者如果我的边界变得更复杂。我的第一个倾向是尝试编写一个类型别名:

type PartialDisplay = PartialOrd + Display;
但这给了我一些相当奇怪的编译器错误:

error[E0393]:必须显式指定类型参数'Rhs'
-->src/main.rs:7:23
|
7 |类型PartialDisplay=PartialOrd+显示;
|^^^^^^^^^^^^^缺少对“Rhs”的引用`
|
=注意:由于默认的“Self”引用,必须在对象类型上指定类型参数
错误[E0225]:只有自动特征可以用作特征对象中的附加特征
-->src/main.rs:7:36
|
7 |类型PartialDisplay=PartialOrd+显示;
|^^^^^^^^非自动附加特征
我猜要么是我的语法错了,要么就是这还不可能。我想要一些像

type PartialDisplay = ???
fn print_min<T: PartialDisplay> { /* ... */ }
type PartialDisplay=???
fn print_min{/*…*/}

PartialOrd
Display
是特征。它描述了如何实现别名,但决定不需要它

相反,您可以创建一个新的trait,将您想要的trait作为超级trait,并提供一个总体实现:

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");
}
使用std::fmt::Display;
trait PartialDisplay:PartialOrd+Display{}
T{}的impl部分显示
fn打印最小值(a:&T,b:&T){
println!(“min={}”,如果a
引入了特征别名的概念。当,您将能够说:

#![feature(trait_alias)]

use std::fmt::Display;

trait PartialDisplay<Rhs = Self> = PartialOrd<Rhs> + Display;

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(&"a", &"b");
}
#![特征(特征别名)]
使用std::fmt::Display;
特征部分显示=部分显示+显示;
fn打印最小值(a:&T,b:&T){
println!(“min={}”,如果a
感谢您链接到讨论,现在更清楚为什么决定不包含它了。您可以按照中所述编写宏trait\u别名
#![feature(trait_alias)]

use std::fmt::Display;

trait PartialDisplay<Rhs = Self> = PartialOrd<Rhs> + Display;

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(&"a", &"b");
}