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.