Associated Types

Associated types are placeholder types which are supplied by the trait implementation.

1. ```
   #[derive(Debug)]
   ```
2. ```
   struct Meters(i32);
   ```
3. ```
   #[derive(Debug)]
   ```
4. ```
   struct MetersSquared(i32);
   ```

6. ```
   trait Multiply {
   ```
7. ```
       type Output;
   ```
8. ```
       fn multiply(&self, other: &Self) -> Self::Output;
   ```
9. ```
   }
   ```

11. ```
    impl Multiply for Meters {
    ```
12. ```
        type Output = MetersSquared;
    ```
13. ```
        fn multiply(&self, other: &Self) -> Self::Output {
    ```
14. ```
            MetersSquared(self.0 * other.0)
    ```
15. ```
        }
    ```
16. ```
    }
    ```

18. ```
    fn main() {
    ```
19. ```
        println!("{:?}", Meters(10).multiply(&Meters(20)));
    ```
20. ```
    }
    ```
  • Associated types are sometimes also called “output types”. The key observation is that the implementer, not the caller, chooses this type.
  • Many standard library traits have associated types, including arithmetic operators and Iterator.