我正在尝试创建一个trait,在其中为所有非引用类型提供一个实现,为所有引用类型提供另一个实现。
这个代码无法编译:
为什么带有“Clone”约束条件的版本能够正常工作,我如何在不使用约束条件的情况下使其正常工作?
这个代码无法编译:
trait Foo {}
impl<T> Foo for T {}
impl<'a, T> Foo for &'a mut T {}
这个操作失败并出现了以下错误
error[E0119]: conflicting implementations of trait `Foo` for type `&mut _`:
--> src/main.rs:3:1
|
2 | impl<T> Foo for T {}
| -------------------- first implementation here
3 | impl<'a, T> Foo for &'a mut T {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&mut _`
很奇怪,这个方法可行:
trait Bar {}
impl<T> Bar for T
where
T: Clone,
{}
impl<'a, T> Bar for &'a mut T
where
T: Clone + 'static,
{}
为什么带有“Clone”约束条件的版本能够正常工作,我如何在不使用约束条件的情况下使其正常工作?
impl<T> Foo for T {}
不够?我的意思是,为什么你需要特别为&mut
引用实现它?你是否还需要另一种类型的实现来处理&'a T
呢? - trent&mut T
不是Clone
。&mut T
满足for T
(因为 &mut T 是一种类型,所以impl<T> Bar for T
也实现了每个&mut T
的 Bar)。克隆版本不会冲突,因为&mut T
永远不会是Clone
(你不能有两个可变引用)。 - daboross