2016-11-22 40 views
4

我们有两个特点AB针对如果两个特征都实现了引用,我如何为所有实现特质A的类型实现特质B?

  1. 我可以平凡实现B为实现A所有类型。
  2. 我可以简单地实现A以引用任何类型的实现A
  3. 对于引用B的任何类型,我可以简单地实施B

实际上,所有三个都会导致冲突,因为现在引用实现A的类型对于它们来说有两个实现B。其中由于impl<T: A> A for &T和一个及物动词由于impl<T: A> B for T(然后impl<T: B> B for &T

我不能删除impl<T: B> B for &T,因为有可能是实现B类型,但不A

这里是表现出示例代码行为

trait A {} 
trait B {} 

impl<'a, T: A> A for &'a T {} 
impl<T: A> B for T {} 

impl<'a, T: B> B for &'a T {} 

这将导致以下错误:

error[E0119]: conflicting implementations of trait `B` for type `&_`: 
    | 
    | impl<T: A> B for T {} 
    | --------------------- first implementation here 
    | impl<'a, T: B> B for &'a T {} 
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_` 

是否可以使用Rust类型系统来确保当有impl B for &A时,我们不会为&B创建一个?

+2

这[博客文章](http://smallcultfollowing.com/babysteps/blog/2016/09/24/intersection-impls/)和[关于它的内部线程](https://internals.rust-lang .org/t/blog-post-intersection-impls/4129)有很多关于它的讨论。一般总结是“尚未”,但可能有一些想法可能有帮助。 –

+0

@ChrisEmerson:也许这是值得让这个答案? –

回答

相关问题