Elaborate further on `Add`.

This commit is contained in:
LukeMathWalker 2024-05-14 11:00:59 +02:00
parent ab2f0298f0
commit b4f5a45424
1 changed files with 27 additions and 3 deletions

View File

@ -71,14 +71,38 @@ It uses both mechanisms:
- it has a generic parameter, `RHS` (right-hand side), which defaults to `Self` - it has a generic parameter, `RHS` (right-hand side), which defaults to `Self`
- it has an associated type, `Output`, the type of the result of the addition - it has an associated type, `Output`, the type of the result of the addition
### `RHS`
`RHS` is a generic parameter to allow for different types to be added together. `RHS` is a generic parameter to allow for different types to be added together.
For example: For example, you'll find these two implementation in the standard library:
```rust
impl Add<u32> for u32 {
type Output = u32;
fn add(self, rhs: u32) -> u32 {
// [...]
}
}
impl Add<&u32> for u32 {
type Output = u32;
fn add(self, rhs: &u32) -> u32 {
// [...]
}
}
```
This allows the following code to compile:
```rust ```rust
let x = 5u32 + &5u32 + 6u32; let x = 5u32 + &5u32 + 6u32;
``` ```
works because `u32` implements `Add<&u32>` _as well as_ `Add<u32>`. because `u32` implements `Add<&u32>` _as well as_ `Add<u32>`.
### `Output`
`Output`, on the other hand, **must** be uniquely determined once the types of the operands `Output`, on the other hand, **must** be uniquely determined once the types of the operands
are known. That's why it's an associated type instead of a second generic parameter. are known. That's why it's an associated type instead of a second generic parameter.