Zoeken…


Opmerkingen

  • AsRef en Borrow zijn vergelijkbaar, maar dienen verschillende doeleinden. Borrow wordt gebruikt om meerdere leenmethoden op dezelfde manier te behandelen, of om geleende waarden te behandelen zoals hun tegenhangers, terwijl AsRef wordt gebruikt voor het genereren van referenties.
  • From<A> for B betekent Into<B> for A , maar niet omgekeerd.
  • From<A> for A is impliciet geïmplementeerd.

Van

Rust's From eigenschap is een algemene eigenschap voor het converteren tussen typen. Voor twee typen TypeA en TypeB ,

impl From<TypeA> for TypeB

geeft aan dat een instantie van TypeB gegarandeerd kan worden opgebouwd uit een instantie van TypeA . Een implementatie van From ziet er zo uit:

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 en std::convert::AsMut worden gebruikt voor het goedkoop omzetten van types naar referenties. Voor types A en B ,

impl AsRef<B> for A

geeft aan dat een &A kan worden omgezet in een &B en,

impl AsMut<B> for A

geeft aan dat een &mut A kan worden omgezet in een &mut B

Dit is handig voor het uitvoeren van typeconversies zonder waarden te kopiëren of te verplaatsen. Een voorbeeld in de standaardbibliotheek is std::fs::File.open() :

fn open<P: AsRef<Path>>(path: P) -> Result<File>

Hierdoor kan File.open() niet alleen Path accepteren, maar ook OsStr , OsString , str , String en PathBuf met impliciete conversie omdat deze typen allemaal AsRef<Path> implementeren.

Borrow, BorrowMut en ToOwned

De eigenschappen std::borrow::Borrow en std::borrow::BorrowMut worden gebruikt om geleende typen te behandelen als eigendomstypen. Voor types A en B ,

impl Borrow<B> for A

geeft aan dat een geleende A kan worden gebruikt waar een B gewenst is. Bijvoorbeeld, std::collections::HashMap.get() gebruikt Borrow voor de methode get() , waardoor een HashMap met sleutels van A kan worden geïndexeerd met een &B


Aan de andere kant implementeert std::borrow::ToOwned de omgekeerde relatie.

Met de bovengenoemde typen A en B kan dus worden geïmplementeerd:

impl ToOwned for B

Opmerking: terwijl A Borrow<T> kan implementeren voor meerdere verschillende typen T , kan B ToOwned één keer implementeren.

Deref & DerefMut

De std::ops::Deref en std::ops::DerefMut kenmerken worden gebruikt voor het overbelasten van de dereference-operator, *x . Voor types A en B ,

impl Deref<Target=B> for A

geeft aan dat het verwijderen van een binding van &A een &B en,

impl DerefMut for A

geeft aan dat dereferencing een binding van &mut A een &mut B .

Deref (resp. DerefMut ) biedt ook een handige taalfunctie genaamd deref dwang , waarmee een &A (resp. &mut A ) automatisch kan dwingen naar een &B (resp. &mut B ). Dit wordt vaak gebruikt bij het converteren van String naar &str , omdat &String indien nodig impliciet wordt gedwongen naar &str .


Opmerking: DerefMut biedt geen ondersteuning voor het specificeren van het resulterende type, het gebruikt hetzelfde type als Deref .

Opmerking: Vanwege het gebruik van een bijbehorend type (in tegenstelling tot in AsRef ), kan een bepaald type elk van Deref en DerefMut maximaal één keer implementeren.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow