如果两个特征都是为引用实现的,那么如何为实现特征A的所有类型实现特征B?

时间:2016-11-22 13:22:54

标签: rust

我们有两个特征AB

  1. 我可以为实现B的所有类型轻松实现A
  2. 我可以轻而易举地实现A对任何实现A的类型的引用。
  3. 我可以轻而易举地实现B对任何实现B的类型的引用。
  4. 实际上,所有三个都会导致冲突,因为现在对实现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创建一个?

1 个答案:

答案 0 :(得分:3)

关于这个主题有一些discussion on the Rust internals forum,从a blog post by Nicholas Matsakis开始,关于如何处理重叠特征实现的问题。

今天,(不稳定)Rust有some impl specialisation,但这只适用于更通用的更严格的更具体的内容。

所以我认为答案是今天没有一个好的方法可以做到,但是在将来的某个时候,Rust很有可能会发展为允许表达重叠的特质动词。