Rust
Konvertierungsmerkmale
Suche…
Bemerkungen
-
AsRefundBorrowsind ähnlich, dienen jedoch unterschiedlichen Zwecken.Borrowwird verwendet, um mehrereAsRefähnlich zu behandeln, oder um entliehene Werte wie ihre eigenen Gegenstücke zu behandeln, währendAsRefzum Generieren von Referenzen verwendet wird. -
From<A> for BbedeutetInto<B> for A, jedoch nicht umgekehrt. -
From<A> for Aist implizit implementiert.
Von
Das Merkmal " From Rust" ist ein allgemeines Merkmal zum Konvertieren zwischen Typen. Für zwei beliebige Typen TypeA und TypeB
impl From<TypeA> for TypeB
gibt an, dass eine Instanz von TypeB garantiert aus einer Instanz von TypeA . Eine Implementierung von From sieht so aus:
struct TypeA {
a: u32,
}
struct TypeB {
b: u32,
}
impl From<TypeA> for TypeB {
fn from(src: TypeA) -> Self {
TypeB {
b: src.a,
}
}
}
AsRef & AsMut
std::convert::AsRef und std::convert::AsMut werden verwendet, um Typen billig in Referenzen std::convert::AsMut . Für die Typen A und B
impl AsRef<B> for A
zeigt an, dass A &A in A &B und
impl AsMut<B> for A
zeigt an, dass a &mut A in a &mut B .
Dies ist nützlich, wenn Sie Typkonvertierungen durchführen, ohne Werte zu kopieren oder zu verschieben. Ein Beispiel in der Standardbibliothek ist std::fs::File.open() :
fn open<P: AsRef<Path>>(path: P) -> Result<File>
Dadurch kann File.open() nicht nur Path , sondern auch OsStr , OsString , str , String und PathBuf mit impliziter Konvertierung OsString , da diese Typen alle AsRef<Path> implementieren.
Ausleihen, AusleihenMut und ToOwned
Die Merkmale std::borrow::BorrowMut std::borrow::Borrow und std::borrow::BorrowMut werden verwendet, um geborgte Typen wie eigene Typen zu behandeln. Für die Typen A und B
impl Borrow<B> for A
gibt an, dass ein geliehenes A verwendet werden kann, wenn ein B gewünscht wird. Zum Beispiel verwendet std::collections::HashMap.get() Borrow für seine get() -Methode, wodurch eine HashMap mit Schlüsseln von A mit einem &B indiziert werden kann.
Auf der anderen Seite implementiert std::borrow::ToOwned die umgekehrte Beziehung.
Mit den vorgenannten Typen A und B kann man also Folgendes implementieren:
impl ToOwned for B
Hinweis: Während A die Borrow<T> für mehrere verschiedene Typen T implementieren kann, kann B nur ToOwned einmalig implementieren.
Deref & DerefMut
Die Merkmale std::ops::Deref und std::ops::DerefMut werden zum Überladen des Dereferenzierungsoperators *x . Für die Typen A und B
impl Deref<Target=B> for A
zeigt an, dass eine Dereferenzierung einer Bindung von &A ein &B ergibt und
impl DerefMut for A
gibt an, dass die Deferenzierung einer Bindung von &mut A &mut B .
Deref (bzw. DerefMut ) bietet auch ein nützliches Sprachmerkmal namens Deref-Zwang , mit dem ein &A (bzw. &mut A ) automatisch zu einem &B (bzw. &mut B ) zwingen kann. Dies wird häufig bei der Konvertierung von String in &str , da &String implizit nach Bedarf in &str . &str .
Hinweis: DerefMut unterstützt die Angabe des resultierenden Typs nicht, es verwendet denselben Typ wie Deref .
Hinweis: Aufgrund der Verwendung eines verknüpften Typs (im Gegensatz zu AsRef ) kann ein bestimmter Typ nur jeweils Deref und DerefMut implementieren.