Entschärfung von überlappenden Merkmalen

Beginner

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

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.rs verwenden und es mit rustc main.rs &&./main kompilieren 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.