如何消除泛型特征方法调用的歧义?



我有以下代码:

struct X { i: i32 }
trait MyTrait<T> {
fn hello(&self);
}
impl MyTrait<i32> for X {
fn hello(&self) { println!("I'm an i32") }
}
impl MyTrait<String> for X {
fn hello(&self) { println!("I'm a String") }
}
fn main() {
let f = X { i: 0 };
f.hello();
}

这显然不会编译,因为编译器无法消除f.hello()属于哪个特征的歧义。所以我收到错误

error[E0282]: type annotations needed
--> srcmain.rs:17:7
|
17 |     f.hello();
|       ^^^^^ cannot infer type for type parameter `T` declared on the trait `MyTrait`

有没有办法注释hello的类型,以便我可以告诉编译器例如在f上调用MyTrait<String>::hello

经过一番挖掘,我遇到了 Rust 书中的"消除歧义的完全限定语法:调用同名方法"。情况可以适应我的,可以用f作为相应特征方法的接收者

<X as MyTrait<String>>::hello(&f);

这将按预期编译和工作。

甚至

<MyTrait<String>>::hello(&f);

工程。

可以使用完全限定的函数调用语法:

fn main() {
let f: X;
// shorthand form
MyTrait::<String>::hello(&f);
// expanded form, with deduced type
<_ as MyTrait<String>>::hello(&f);
// expanded form, with explicit type
<X as MyTrait<String>>::hello(&f);
}

在操场上跑步

相关内容

  • 没有找到相关文章

最新更新