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

oli*_*obk 5 rust

我们有两个特点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 {}
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

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 `&_`
Run Code Online (Sandbox Code Playgroud)

是否有可能以某种方式使用Rust类型系统来确保当存在时impl B for &A,我们不为其创建一个&B

Chr*_*son 3

Rust 内部论坛上对此主题进行了一些讨论,首先是Nicholas Matsakis 的博客文章Nicholas Matsakis 发表的一篇关于如何处理重叠特征实现问题的

如今,(不稳定的)Rust 有一些 impl 专业化,但这仅适用于更通用的 impl 的严格更具体的 impl。

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