Rust
Conversie eigenschappen
Zoeken…
Opmerkingen
-
AsRef
enBorrow
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, terwijlAsRef
wordt gebruikt voor het genereren van referenties. -
From<A> for B
betekentInto<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.