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 comrustc 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.