• BB_C
    link
    fedilink
    arrow-up
    1
    ·
    13 hours ago

    Stating the obvious: a trait is type class you implement for types. It’s not something you can “pin metadata” (or any data) to.

    • orclev@lemmy.world
      link
      fedilink
      arrow-up
      2
      ·
      12 hours ago

      It’s an API, if you add methods to it then the implementations will support that. That is in fact the entire point of a trait.

      • BB_C
        link
        fedilink
        arrow-up
        1
        ·
        4 hours ago
        struct SomeFuture;
        
        impl Future for SomeFuture {
          // ....
        }
        
        

        where are you going to “pin metadata”?

        • lad
          link
          fedilink
          English
          arrow-up
          1
          ·
          3 hours ago

          I think, they mean:

          pub trait Future {
            // ....
          
            fn put_metadata(...);
          
            fn get_metadata(...);
          }
          

          I find it too magical to be necessary, but I can see how it might be useful. This can be achieved with a wrapper, but will then require you to wrap every future, which is not too convenient

          • BB_C
            link
            fedilink
            arrow-up
            1
            ·
            4 minutes ago

            It’s not about magic, it’s just not how the abstraction works.

            Let’s have a concrete example, poem::web::Data utilizes opentelemetry::context::FutureExt which has the trait methods with_context() and with_current_context(). But where is the data/context actually stored? In the WithContext struct of course. Because there is no such a thing as pinning (meta)data to a trait.

            @[email protected] ^^

          • devnev@lemmy.dbzer0.com
            link
            fedilink
            arrow-up
            1
            ·
            47 minutes ago

            Other languages have ended up introducing it out of practical necessity, e.g. Go’s contexts, JS execution contexts. Pick your poison, although I expect Rust’s general minimal approach will leave it as extra parameters, Go-style.