Zum Inhalt springen

Traits

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.


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.


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.


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.