Traits

Rust permite abstrair características dos tipos usando trait. Eles são semelhantes a interfaces:

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

struct Cachorro {
    nome: String,
}

struct Gato;

impl Pet for Cachorro {
    fn nome(&self) -> String {
        self.nome.clone()
    }
}

impl Pet for Gato {
    fn nome(&self) -> String {
        String::from("Gato") // Sem nomes, gatos não respondem mesmo.
    }
}

fn saudar<P: Pet>(pet: &P) {
    println!("Quem é? É o {}!", pet.nome());
}

fn main() {
    let bidu = Cachorro { nome: "Bidu".into() };
    saudar(&bidu);

    let felix = Gato;
    saudar(&felix);
}