如果所有类型都实现了trait A,而且对于引用也实现了这两个特质,那么我该如何为所有类型实现trait B?

7
我们有两个特征A和B,其中:
1. 我可以轻松地为实现A的所有类型实现B。 2. 我可以轻松地为任何实现A的类型的引用实现A。 3. 我可以轻松地为任何实现B的类型的引用实现B。
事实上,执行这三个操作会导致冲突,因为现在实现A的类型的引用将具有两个实现B的实现。一种是由于impl<T: A> A for &T,另一种是由于transitively 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
这篇博客文章以及相关的内部讨论帖子都对此进行了大量讨论。总的来说,结论是“还没有”,但其中可能有一些想法可以提供帮助。 - Chris Emerson
@ChrisEmerson:也许把这个作为答案会更有价值? - Matthieu M.
1个回答

3

关于这个问题,Rust内部论坛上有一些讨论, 其中包括Nicholas Matsakis的博客文章,讨论如何处理重叠特征实现的问题。

目前,(不稳定的)Rust已经具有某些impl特化功能, 但仅适用于更通用的impl的严格更具体的实现。

因此,我认为答案是目前没有很好的方法来解决这个问题,但在未来,Rust有很大的机会发展出可以表达重叠特征impls的能力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接