• INeedMana@lemmy.world
    link
    fedilink
    arrow-up
    1
    ·
    7 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
      link
      fedilink
      arrow-up
      2
      ·
      edit-2
      7 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.

        • livingcoder
          link
          fedilink
          arrow-up
          2
          ·
          6 days ago

          Exactly. The functions of the super trait are also required when implementing the child trait’s functions, as you would expect from inheritance.