• Ephera@lemmy.ml
    link
    fedilink
    English
    arrow-up
    1
    ·
    2 months ago

    The rule of thumb I always tell people is that they should generally put owned data into struct fields and references into function parameters.

    • calcopiritus@lemmy.world
      link
      fedilink
      arrow-up
      3
      ·
      2 months ago

      Good rule of thumb. As long as it’s not followed blindly of course.

      Structs with lifetimes are often quite convenient. Especially for performance.

      • Ephera@lemmy.ml
        link
        fedilink
        English
        arrow-up
        1
        ·
        2 months ago

        Ah yeah, via deref coercion, which is also called “auto-dereferencing” at times. Not to be confused with “auto-referencing”, which is also a thing[1].

        You can do some wild shit with deref coercion. And when I say “wild”, I guess, I’m talking about the most normal thing for Java devs, because well, it’s a lot like inheritance. 😅

        Basically, this concept of being able to pass &String into a parameter that takes &str also applies to the self parameter. Or in other words, methods implemented on str can also be called on String, as if String extends str.
        And well, obviously you can also make use of that yourself, by writing your own wrapper type. You can even “override” existing methods in a sense by re-defining them in the wrapper type.

        I had to play around a bit with it myself, so here’s a playground: https://play.rust-lang.org/?version=stable&mode=debug&edition=2024&gist=af65ed396dec88c8406163acaa1f8f8d


        1. https://doc.rust-lang.org/nomicon/dot-operator.html ↩︎