• livingcoder@programming.dev
    link
    fedilink
    arrow-up
    13
    ·
    edit-2
    7 days ago

    Wow, that trait feature is great. I’ve been eagerly waiting for that one for a long time. Thank you to everyone who made that possible.

    • INeedMana@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      2 days ago

      If a trait has a supertrait you can coerce a reference to said trait object to a reference to a trait object of the supertrait

      As someone that just started learning Rust: wha?

      • livingcoder@programming.dev
        link
        fedilink
        arrow-up
        2
        ·
        edit-2
        2 days ago

        Basically, you can generalize your trait types into their parent (super) traits for situations when functionality is specific to those supertrait objects.

        As an example, if you have a trait CanBark and it is a super trait for the trait IsDog, you can coerce your references of &dyn IsDog into a &dyn CanBark. You can then work with other trait types that share a super trait.

        trait CanBark {
            fn bark(&self);
        }
        trait IsSeal: CanBark { }
        trait IsDog: CanBark { }
        
        fn bark_as_group(barkers: &Vec<&dyn CanBark>) {
            for barker in barkers {
                barker.bark();
            }
        }
        
        let spot: &dyn IsDog = get_spot();
        let seal: &dyn IsSeal = get_seal();
        let barkers: Vec<&dyn CanBark> = Vec::new();
        barkers.push(spot);  // coerced
        barkers.push(seal);  // coerced
        bark_as_group(&barkers);
        

        At least, I hope this is possible now. If it’s purely “you can return a coerced type from a function”, that is less useful.