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

Rust 如果两个特性都是为引用而实现的,那么如何为实现特性A的所有类型实现特性B?,rust,Rust,我们有两个特点,分别是A和B 我可以为实现A的所有类型实现B 对于实现A的任何类型的引用,我都可以实现A 对于实现B的任何类型的引用,我都可以实现B 实际上,执行这三个操作都会导致冲突,因为现在对实现a的类型的引用将有两个B的实现。一个是由于impl A for&T,另一个是由于impl B for T(然后是impl B for&T) 我无法删除impl B for&t,因为可能存在实现B而不是A的类型 下面是一个显示该行为的示例代码 trait A {} trait B {} impl&l

我们有两个特点,分别是
A
B

  • 我可以为实现
    A
    的所有类型实现
    B
  • 对于实现
    A
    的任何类型的引用,我都可以实现
    A
  • 对于实现
    B
    的任何类型的引用,我都可以实现
    B
  • 实际上,执行这三个操作都会导致冲突,因为现在对实现
    a
    的类型的引用将有两个
    B
    的实现。一个是由于
    impl A for&T
    ,另一个是由于
    impl B for T
    (然后是
    impl B for&T

    我无法删除
    impl 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 {}
    
    trait A{}
    性状B{}
    impl在这个主题上已经有了一些讨论,首先是关于如何处理重叠的trait实现的问题

    如今,(不稳定的)锈病已经出现了,但这只适用于严格意义上更具体的锈病,而不是更普通的锈病


    因此,我认为答案是,目前还没有一个好的方法可以做到这一点,但在未来的某个时候,锈菌很有可能会进化到允许表达重叠的性状impls。

    这一点和其他人对此进行了大量讨论。总体而言,总结是“还没有”,但其中可能有一些想法可能会有所帮助。@ChrisEmerson:也许值得回答这个问题?