2016-11-22 88 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:也許這是值得讓這個答案? –

回答

相關問題