Implementando Traits

trait Pet {
    fn talk(&self) -> String;

    fn greet(&self) {
        println!("Oh, você é adorável! Qual é o seu nome? {}", self.talk());
    }
}

struct Dog {
    name: String,
    age: i8,
}

impl Pet for Dog {
    fn talk(&self) -> String {
        format!("Auau, meu nome é {}", self.name)
    }
}

fn main() {
    let fido = Dog { name: String::from("Bidu"), age: 5 };
    fido.greet();
}
  • Para implementar Trait para Type, você usa um bloco impl Trait for Type { .. }.

  • Ao contrário das interfaces Go, apenas ter métodos correspondentes não é suficiente: um tipo Cat com um método talk() não satisfaria automaticamente Pet a menos que esteja em um bloco impl Pet.

  • Os traits podem fornecer implementações padrão de alguns métodos. As implementações padrão podem depender de todos os métodos do trait. Neste caso, greet é fornecido e depende de talk.