Rust
Образцы конверсии
Поиск…
замечания
-
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 не более одного раза.