Einführung
In diesem Lab wird das Problem der Entschärfung von überlappenden Merkmalen diskutiert, wobei zwei Merkmale Methoden mit demselben Namen und möglicherweise unterschiedlichen Rückgabetypen haben.
Hinweis: Wenn das Lab keinen Dateinamen angibt, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie
main.rsverwenden und es mitrustc main.rs &&./mainkompilieren und ausführen.
Entschärfung von überlappenden Merkmalen
Ein Typ kann viele verschiedene Merkmale implementieren. Was ist, wenn zwei Merkmale denselben Namen erfordern? Beispielsweise könnten viele Merkmale eine Methode namens get() haben. Sie könnten sogar unterschiedliche Rückgabetypen haben!
Gute Nachricht: Da jede Merkmalsimplementierung ihren eigenen impl-Block erhält, ist klar, welches Merkmals-get-Methode Sie implementieren.
Was ist, wenn es darum geht, diese Methoden aufzurufen? Um zwischen ihnen zu entscheiden, müssen wir die vollqualifizierte Syntax verwenden.
trait UsernameWidget {
// Holen Sie sich den ausgewählten Benutzernamen aus diesem Widget
fn get(&self) -> String;
}
trait AgeWidget {
// Holen Sie sich das ausgewählte Alter aus diesem Widget
fn get(&self) -> u8;
}
// Ein Formular mit sowohl einem UsernameWidget als auch einem 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,
};
// Wenn Sie diese Zeile entschärfen, erhalten Sie einen Fehler, der besagt,
// dass "mehrere `get` gefunden wurden". Denn schließlich gibt es mehrere Methoden
// mit dem Namen `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);
}
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das Lab "Entschärfung von überlappenden Merkmalen" abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.