this post was submitted on 17 Jun 2025
12 points (100.0% liked)

Rust

7129 readers
18 users here now

Welcome to the Rust community! This is a place to discuss about the Rust programming language.

Wormhole

!performance@programming.dev

Credits

  • The icon is a modified version of the official rust logo (changing the colors to a gradient and black background)

founded 2 years ago
MODERATORS
 

Maybe the question is not well written, but it's because I do not really know what's happening in here. I'm learning Rust, I'm doing pretty good, but this is the second time that stomp with this.

First, I thought that only the Add trait would be enough, but the LSP keep saying me this if I do not add the "restriction", as far as I know.

What I do not get is what <Output = T> is. I know that is using the type T, but why it is assigned to Output?

The first time that I saw something similar was in the Rust book that comes with rustup, just look at the next function signature

Thank you for you help, you are awesome.

you are viewing a single comment's thread
view the rest of the comments
[–] anselmschueler@ieji.de 6 points 2 weeks ago (6 children)

@capuccino You're not assigning anything. The Output = T is expressing a constraint. It's saying that the addition of T has to result in T again. A type can implement Add with any output type it wants.

[–] capuccino@lemmy.world 1 points 2 weeks ago (3 children)

I see. How can I define my own constraints in traits? Maybe seeing how to, I can full understand what's happening behind

[–] anselmschueler@ieji.de 1 points 2 weeks ago (2 children)

@capuccino

A trait can have an associated type. You write this "trait Foo { type Bar; }". Then, when you implement the trait, you have to specify this type, with "type Bar = Something;". This is different from the trait itself being generic, because there can only be a single associated type, so you can't implement the trait multiple times with different associated types.

[–] anselmschueler@ieji.de 0 points 2 weeks ago (1 children)

@capuccino

Then, when you write somewhere that some type satisfies a trait, like "T: Foo", and Foo has an associated type, you can further specify that not only does T need to implement Foo, but that the associated type satisfies some criteria.

You can do this two ways:
"Foo<Bar = Something>" says it has to be something specific,
"Foo<Bar: Baz>" says that it has to implement another trait

[–] capuccino@lemmy.world 1 points 2 weeks ago

Amazing, so I can keep still using traits as constraints rather than types. I understand know. Hehehe, this is something that has been in my head since days ago

load more comments (2 replies)