Szukaj…


Uwagi

  • AsRef i Borrow 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, a AsRef służy do generowania odniesień.
  • From<A> for B oznacza Into<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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow