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
не более одного раза.