Expand description
Трейты для преобразования типов.
Трейты Of
/To
являются заменой From
/Into
из стандартной библиотеки и имеют более функциональный вид.
Данная реализация From
/Into
может быть полензна, когда мы хотим сохранить функциональный стиль, при том что у нашего типа есть множество реализаций трейта From
.
§Стандартная реализация с From
/Into
Когда у типа TypeInto
появляется более одной реализации типажа From
, нам необходимо указать компилятору, какую из реализаций мы используем в данный момент.
В стандартной реализации From
/Into
это можно сделать с помощью следующих конструкций:
<TypeFrom as Into<TypeInto>>::
Into::<TypeInto>>::
, гдеTypeFrom
- тип, который укзан в реализации какimpl From<TypeFrom> for TypeInto
.
§Пример
struct Rubles;
struct Euros;
struct Dollars;
impl From<Rubles> for Dollars {
fn from(value: Rubles) -> Self {
Dollars
}
}
impl From<Euros> for Dollars {
fn from(value: Euros) -> Self {
Dollars
}
}
fn from_into() {
let dollars = <Euros as Into<Dollars>>::into(Euros);
let dollars = Into::<Dollars>::into(Euros);
}
§Реализацис c Of
/To
Для того чтобы указать компилятору сигнатуру опрделеной реализации трейта, мы можем указать границы не только для самого трейта (высокий уровень), но и для функций этого трейта (низкий уровень).
Так в трейте To
, generic типа, в который мы выполняем преобразование, указывается для метода to
.
Теперь, чтобы указать конкртеную реализацию, нам достаточно конретизировать метод трейта:
TypeFrom.to::<TypeInto>()
§Пример
impl Of<Rubles> for Dollars {
fn of(value: Rubles) -> Self {
Dollars
}
}
impl Of<Euros> for Dollars {
fn of(value: Euros) -> Self {
Dollars
}
}
fn of_to() {
let dollars = Rubles.to::<Dollars>();
let dollars = Euros.to::<Dollars>();
}