Traits
Add Trait: Typenparameter vs. assoziierter Typ
Abschnitt betitelt „Add Trait: Typenparameter vs. assoziierter Typ“Erinnern Sie sich an die Definition des Add-Traits:
trait Add<Rhs=Self> { type Output; fn add(self, rhs: Rhs) -> Self::Output;}Welche der folgenden Aussagen beschreibt am besten, warum Output ein assoziierter Typ ist, während Rhs ein Typenparameter ist?
Es stimmt, dass ein assoziierter Typ derzeit keinen Standardwert haben kann, aber das ist nicht der Hauptgrund, warum Rhs ein Typenparameter im Add-Trait ist.
Add Trait: Typenparameter-Position
Abschnitt betitelt „Add Trait: Typenparameter-Position“Erinnern Sie sich an die Definition des Add-Traits:
trait Add<Rhs=Self> { type Output; fn add(self, rhs: Rhs) -> Self::Output;}Welche der folgenden Aussagen beschreibt am besten, warum Rhs ein Typenparameter des Traits Add und nicht der Funktion add ist? Das heißt, warum ist Add nicht so konzipiert:
trait Add { type Output; fn add<Rhs>(self, rhs: Rhs) -> Self::Output;}Ein solches Design würde wenig Sinn ergeben, da add<Rhs> keine Informationen über die Struktur von Rhs hätte, sodass es unmöglich wäre, auf diese Weise eine sinnvolle Additionsfunktion zu implementieren.
Trait-Methoden-Auflösung
Abschnitt betitelt „Trait-Methoden-Auflösung“mod inner { pub trait A { fn f(&self) -> usize { 0 } } pub trait B { fn f(&self) -> usize { 1 } } pub struct P; impl A for P {} impl B for P {}}fn main() { use inner::{P, B}; println!("{}", P.f());}Wenn nur eine von zwei widersprüchlichen Trait-Implementierungen importiert wird, verwendet Rust die importierte Implementierung. Vollqualifizierte Syntax ist hier nicht notwendig.
Newtype für Trait-Implementierung
Abschnitt betitelt „Newtype für Trait-Implementierung“Stellen Sie sich vor, Sie implementieren einen Trait Trait für einen Typ T. In welcher der folgenden Situationen müssen Sie T in einen Newtype verpacken?
Die Orphan-Regel besagt, dass ein Trait nicht für einen Typ implementiert werden kann, wenn beide in einer externen Krate definiert sind, was einen Newtype erforderlich macht. Wenn entweder der Trait oder der Typ lokal definiert sind, ist ein Newtype unnötig.