Suche…


Bemerkungen

  • AsRef und Borrow sind ähnlich, dienen jedoch unterschiedlichen Zwecken. Borrow wird verwendet, um mehrere AsRef ähnlich zu behandeln, oder um entliehene Werte wie ihre eigenen Gegenstücke zu behandeln, während AsRef zum Generieren von Referenzen verwendet wird.
  • From<A> for B bedeutet Into<B> for A , jedoch nicht umgekehrt.
  • From<A> for A ist 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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow