Rust
Cechy konwersji
Szukaj…
Uwagi
-
AsRefiBorrowsą podobne, ale służą do różnych celów.Borrowsłuży do podobnego traktowania wielu metod pożyczania lub do traktowania pożyczonych wartości jak ich własnych odpowiedników, aAsRefsłuży do generowania odniesień. -
From<A> for BoznaczaInto<B> for A, ale nie odwrotnie. -
From<A> for Ajest domyślnie zaimplementowane.
Od
Cecha Rust's From jest cechą ogólnego przeznaczenia służącą do konwersji typów. Dla dowolnych dwóch typów TypeA i TypeB ,
impl From<TypeA> for TypeB
wskazuje, że wystąpienie TypeB jest gwarantowane do zbudowania z wystąpienia TypeA . Implementacja From wygląda następująco:
struct TypeA {
a: u32,
}
struct TypeB {
b: u32,
}
impl From<TypeA> for TypeB {
fn from(src: TypeA) -> Self {
TypeB {
b: src.a,
}
}
}
AsRef i AsMut
std::convert::AsRef i std::convert::AsMut są używane do taniej konwersji typów na referencje. W przypadku typów A i B
impl AsRef<B> for A
wskazuje, że &A można przekształcić w A &B oraz
impl AsMut<B> for A
wskazuje, że a &mut A można przekształcić w a &mut B
Jest to przydatne do wykonywania konwersji typów bez kopiowania lub przenoszenia wartości. Przykładem w standardowej bibliotece jest std::fs::File.open() :
fn open<P: AsRef<Path>>(path: P) -> Result<File>
Pozwala to File.open() akceptować nie tylko Path , ale także OsStr , OsString , str , String i PathBuf z niejawną konwersją, ponieważ wszystkie te typy implementują AsRef<Path> .
Pożycz, BorrowMut i ToOwned
Cechy std::borrow::Borrow i std::borrow::BorrowMut są używane do traktowania pożyczonych typów jak typów własnych. W przypadku typów A i B
impl Borrow<B> for A
wskazuje, że pożyczone A może być użyte tam, gdzie pożądane jest B Na przykład, std::collections::HashMap.get() używa Borrow jako metody get() , umożliwiając indeksowanie HashMap z kluczami A za pomocą A &B
Z drugiej strony, std::borrow::ToOwned implementuje odwrotną zależność.
Zatem dzięki wyżej wymienionym typom A i B można wdrożyć:
impl ToOwned for B
Uwaga: podczas gdy A może wdrożyć Borrow<T> dla wielu różnych typów T , B może wdrożyć ToOwned tylko raz.
Deref & DerefMut
Funkcje std::ops::Deref i std::ops::DerefMut są używane do przeciążania operatora dereferencji, *x . W przypadku typów A i B
impl Deref<Target=B> for A
wskazuje, że usunięcie dereferencji z powiązaniem &A da &A &B a,
impl DerefMut for A
wskazuje, że usunięcie odniesienia z wiązania &mut A da &mut A &mut B
Deref (resp. DerefMut ) zapewnia również funkcję języka przydatnych nazwie deref przymusu, co umożliwia &A (odp. &mut A ), aby automatycznie zmusić do &B (odp. &mut B ). Jest to powszechnie stosowane podczas konwertowania z String na &str , ponieważ &String jest domyślnie przymuszany do &str w razie potrzeby.
Uwaga: DerefMut nie obsługuje określania typu wynikowego, używa tego samego typu co Deref .
Uwaga: Ze względu na użycie powiązanego typu (inaczej niż w AsRef ), dany typ może implementować każdy z Deref i DerefMut tylko raz.