我有以下代码:
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);
}
在操场上跑步