E0119
对于同一类型存在互相矛盾的 trait 实现。
错误代码示例:
trait MyTrait {
fn get(&self) -> usize;
}
impl<T> MyTrait for T {
fn get(&self) -> usize { 0 }
}
struct Foo {
value: usize
}
impl MyTrait for Foo { // error: conflicting implementations of trait
// `MyTrait` for type `Foo`
fn get(&self) -> usize { self.value }
}
在寻找 trait 的时候,编译器找到了 impl<T> MyTrait for T
T 是任意类型和 impl MyTrait for Foo
。 由于一个 trait 不能被实现多次,因此这是一个错误。所以当你写出:
trait MyTrait {
fn get(&self) -> usize;
}
impl<T> MyTrait for T {
fn get(&self) -> usize { 0 }
}
这使得 trait 在这个域上为所有类型实现了。 所以如果你试图在后面实现另一个,就会产生冲突。例如:
trait MyTrait {
fn get(&self) -> usize;
}
impl<T> MyTrait for T {
fn get(&self) -> usize { 0 }
}
struct Foo;
fn main() {
let f = Foo;
f.get(); // (该类型的这个 MyTrait)trait 已经实现了,所以我们可以使用它
}
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。