我在示例 rust 项目中创建了一个函数,用于比较实现 PartialOrd 特征的类型的两个值。它没有编译。以下是示例代码:
fn main(){
let x: i32 = 5;
let y: i32 = 6;
dbg!(greater_than(&x, &y));
}
fn greater_than(x: &impl PartialOrd, y: &impl PartialOrd) -> bool{
x > y
}
我正在使用 RustRover IDE (EAP)。我也用Vs代码。我收到以下错误
我的理解是,一旦使用 impl 特征语法输入函数签名中的参数,任何实现该特征的类型(i32 旨在实现 PartialOrd 特征)都可以在函数中用作参数。 (我使用了不同的函数签名 - 使用如下所示的特征边界 - 并且效果很好):
fn greater_than<T: PartialOrd>(x: &T, y: &T) -> bool
每次出现
impl Trait
都会给出一个新的 distinct 类型参数。例如,x
可以是u32
和y
String
。两者都实现了PartialOrd
,但仍然无法相互比较。
你想要的不能用
impl Trait
来表达,因为你需要两次提及类型:
fn greater_than<T: PartialOrd>(x: &T, y: &T) -> bool{
x > y
}
或者,接受甚至两种不同的类型,只要它们可以比较:
fn greater_than<T: PartialOrd<U>, U>(x: &T, y: &U) -> bool {
x > y
}
我的理解是,一旦使用 impl 特征语法输入函数签名中的参数,任何实现该特征的类型(i32 旨在实现 PartialOrd 特征)都可以在函数中用作参数。
嗯,是的,但是
impl trait
定义了你的论点之间没有关系,所以你所写的本质上是
fn greater_than<T: PartialOrd, U: PartialOrd>(x: &T, y: &U) -> bool
因此,每个论点都可以部分地与其自身进行比较,但并不意味着它们之间可以部分地进行比较。对于所有 Rust 而言,您可以传递 i32 作为第一个参数,传递 String 作为第二个参数,它们都
impl PartialOrd
。