Desambiguação de Traits Sobrepostos

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, discute-se a questão da desambiguação de traits sobrepostos, onde dois traits possuem métodos com o mesmo nome e potencialmente diferentes tipos de retorno.

Nota: Se o laboratório não especificar um nome de arquivo, você pode usar qualquer nome de arquivo que desejar. Por exemplo, você pode usar main.rs, compilar e executá-lo com rustc main.rs && ./main.

Desambiguação de traits sobrepostos

Um tipo pode implementar muitos traits diferentes. E se dois traits exigirem o mesmo nome? Por exemplo, muitos traits podem ter um método chamado get(). Eles podem até ter diferentes tipos de retorno!

Boas notícias: porque cada implementação de trait recebe seu próprio bloco impl, fica claro qual método get do trait você está implementando.

Mas e quando chega a hora de chamar esses métodos? Para desambiguá-los, precisamos usar a Sintaxe Totalmente Qualificada (Fully Qualified Syntax).

trait UsernameWidget {
    // Get the selected username out of this widget
    fn get(&self) -> String;
}

trait AgeWidget {
    // Get the selected age out of this widget
    fn get(&self) -> u8;
}

// A form with both a UsernameWidget and an AgeWidget
struct Form {
    username: String,
    age: u8,
}

impl UsernameWidget for Form {
    fn get(&self) -> String {
        self.username.clone()
    }
}

impl AgeWidget for Form {
    fn get(&self) -> u8 {
        self.age
    }
}

fn main() {
    let form = Form {
        username: "rustacean".to_owned(),
        age: 28,
    };

    // If you uncomment this line, you'll get an error saying
    // "multiple `get` found". Because, after all, there are multiple methods
    // named `get`.
    // println!("{}", form.get());

    let username = <Form as UsernameWidget>::get(&form);
    assert_eq!("rustacean".to_owned(), username);
    let age = <Form as AgeWidget>::get(&form);
    assert_eq!(28, age);
}

Resumo

Parabéns! Você concluiu o laboratório de Desambiguação de Traits Sobrepostos. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.