Implementing Traits

1. ```
   trait Pet {
   ```
2. ```
       fn talk(&self) -> String;
   ```

4. ```
       fn greet(&self) {
   ```
5. ```
           println!("Oh you're a cutie! What's your name? {}", self.talk());
   ```
6. ```
       }
   ```
7. ```
   }
   ```

9. ```
   struct Dog {
   ```
10. ```
        name: String,
    ```
11. ```
        age: i8,
    ```
12. ```
    }
    ```

14. ```
    impl Pet for Dog {
    ```
15. ```
        fn talk(&self) -> String {
    ```
16. ```
            format!("Woof, my name is {}!", self.name)
    ```
17. ```
        }
    ```
18. ```
    }
    ```

20. ```
    fn main() {
    ```
21. ```
        let fido = Dog { name: String::from("Fido"), age: 5 };
    ```
22. ```
        fido.greet();
    ```
23. ```
    }
    ```
  • To implement Trait for Type, you use an impl Trait for Type { .. } block.
  • Unlike Go interfaces, just having matching methods is not enough: a Cat type with a talk() method would not automatically satisfy Pet unless it is in an impl Pet block.
  • Traits may provide default implementations of some methods. Default implementations can rely on all the methods of the trait. In this case, greet is provided, and relies on talk.