Rust
Cechy konwersji
Szukaj…
Uwagi
-
AsRef
iBorrow
są podobne, ale służą do różnych celów.Borrow
służy do podobnego traktowania wielu metod pożyczania lub do traktowania pożyczonych wartości jak ich własnych odpowiedników, aAsRef
służy do generowania odniesień. -
From<A> for B
oznaczaInto<B> for A
, ale nie odwrotnie. -
From<A> for A
jest 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.