Is there some way to implement a trait on multiple traits?

前端 未结 1 1900
无人及你
无人及你 2021-01-19 14:42

Why doesn\'t this work:

trait Update {
    fn update(&mut self);
}

trait A {}
trait B {}

impl Update for T {
    fn update(&mut self) {         


        
相关标签:
1条回答
  • 2021-01-19 15:31

    What would you expect the output of this program to be?

    struct AAndB {}
    impl A for AAndB {}
    impl B for AAndB {}
    
    let a_and_b = AAndB {};
    a_and_b.update();
    

    There is an unstable compiler feature, specialization, which you can enable in nightly builds, which lets you have overlapping instances, and the most "specialized" is used.

    But, even with specialization enabled, your example won't work because A and B are completely equivalent so you could never unambiguously pick an instance.

    As soon as there is an obviously "more specialized" instance, it will compile and work as expected - provided you are using a nightly build of Rust with specialization enabled. For example, if one of the traits is bounded by the other, then it is more specialized, so this would work:

    #![feature(specialization)]
    
    trait Update {
        fn update(&mut self);
    }
    
    trait A {}
    trait B: A {}
    
    impl<T: A> Update for T {
        default fn update(&mut self) {
            println!("A")
        }
    }
    
    impl<U: B> Update for U {
        fn update(&mut self) {
            println!("B")
        }
    }
    

    Specifying the implementation method as default allows another more specific implementation to define its own version of the method.

    0 讨论(0)
提交回复
热议问题