Поиск…


замечания

  • AsRef и Borrow аналогичны, но служат различным целям. Borrow используется для обработки нескольких методов заимствования аналогичным образом или для обработки заемных ценностей, таких как принадлежащие им коллеги, в то время как AsRef используется для обобщения ссылок.
  • From<A> for B подразумевается Into<B> for A , но не наоборот.
  • From<A> for A неявно реализовано.

От

Rust's From trait - это универсальная черта для преобразования типов. Для любых двух типов TypeA и TypeB ,

impl From<TypeA> for TypeB

указывает, что экземпляр TypeB гарантированно будет создан из экземпляра TypeA . Реализация From выглядит следующим образом:

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 и std::convert::AsMut используются для дешевого преобразования типов в ссылки. Для типов A и B ,

impl AsRef<B> for A

указывает, что a &A может быть преобразовано в a &B и,

impl AsMut<B> for A

указывает, что a &mut A может быть преобразован в a &mut B

Это полезно для выполнения преобразований типов без копирования или перемещения значений. Пример в стандартной библиотеке: std::fs::File.open() :

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

Это позволяет File.open() принимать не только Path , но также OsStr , OsString , str , String и PathBuf с неявным преобразованием, поскольку эти типы реализуют AsRef<Path> .

Заимствовать, BorrowMut и ToOwned

Значения std::borrow::Borrow и std::borrow::BorrowMut используются для обработки заимствованных типов, таких как принадлежащие им типы. Для типов A и B ,

impl Borrow<B> for A

указывает, что заимствованный A может использоваться там, где требуется B Например, std::collections::HashMap.get() использует Borrow для метода get() , позволяя индексировать HashMap с ключами A с помощью &B


С другой стороны, std::borrow::ToOwned реализует обратную связь.

Таким образом, с вышеупомянутыми типами A и B можно реализовать:

impl ToOwned for B

Примечание: в то время как A может реализовать Borrow<T> для нескольких разных типов T , B может реализовать ToOwned однократно ToOwned .

Deref & DerefMut

std::ops::Deref и std::ops::DerefMut используются для перегрузки оператора разыменования *x . Для типов A и B ,

impl Deref<Target=B> for A

указывает, что разыменование связывания &A даст a &B и,

impl DerefMut for A

указывает на то, что разыменование связывания &mut A даст a &mut B

Deref (соответственно DerefMut ) также предоставляет полезную функцию языка, называемую deref coercion , которая позволяет &A (resp. &mut A ) автоматически принуждать к &B (соответственно &mut B ). Это обычно используется при преобразовании из String в &str , поскольку &String неявно принудительно привязывается к &str мере необходимости.


Примечание. DerefMut не поддерживает указание результирующего типа, он использует тот же тип, что и Deref .

Примечание. Из-за использования связанного типа (в отличие от AsRef ) данный тип может выполнять только каждый из Deref и DerefMut не более одного раза.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow