为什么“impl Trait”语法在我创建的函数中不起作用?

问题描述 投票:0回答:2

我在示例 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代码。我收到以下错误

image showing error message

我的理解是,一旦使用 impl 特征语法输入函数签名中的参数,任何实现该特征的类型(i32 旨在实现 PartialOrd 特征)都可以在函数中用作参数。 (我使用了不同的函数签名 - 使用如下所示的特征边界 - 并且效果很好):

fn greater_than<T: PartialOrd>(x: &T, y: &T) -> bool

rust rust-cargo
2个回答
1
投票

每次出现

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
}

0
投票

我的理解是,一旦使用 impl 特征语法输入函数签名中的参数,任何实现该特征的类型(i32 旨在实现 PartialOrd 特征)都可以在函数中用作参数。

嗯,是的,但是

impl trait
定义了你的论点之间没有关系,所以你所写的本质上是

fn greater_than<T: PartialOrd, U: PartialOrd>(x: &T, y: &U) -> bool

因此,每个论点都可以部分地与其自身进行比较,但并不意味着它们之间可以部分地进行比较。对于所有 Rust 而言,您可以传递 i32 作为第一个参数,传递 String 作为第二个参数,它们都

impl PartialOrd

© www.soinside.com 2019 - 2024. All rights reserved.