4
我們有兩個特點A
和B
針對如果兩個特徵都實現了引用,我如何爲所有實現特質A的類型實現特質B?
- 我可以平凡實現
B
爲實現A
所有類型。 - 我可以簡單地實現
A
以引用任何類型的實現A
。 - 對於引用
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
創建一個?
這[博客文章](http://smallcultfollowing.com/babysteps/blog/2016/09/24/intersection-impls/)和[關於它的內部線程](https://internals.rust-lang .org/t/blog-post-intersection-impls/4129)有很多關於它的討論。一般總結是「尚未」,但可能有一些想法可能有幫助。 –
@ChrisEmerson:也許這是值得讓這個答案? –