Трейт From
Трейт From используется для преобразования
значения одного типа в значение другого типа.
Он является частью модуля std::convert
и реализует метод from, который принимает
значение исходного типа и возвращает значение
целевого типа. Трейт From обычно
реализуют для типов, которые могут быть созданы
из других типов без потери информации и без
возможности ошибки.
Параметром метод from принимает значение,
которое нужно преобразовать. Возвращает метод
значение целевого типа. Трейт From
автоматически предоставляет реализацию трейта
Into, поэтому вместо вызова from
часто можно использовать метод into.
Синтаксис
impl From<Source> for Target
{
fn from(value: Source) -> Target
{
// ...
}
}
Также трейт From можно вызывать через
ассоциированную функцию:
Target::from(value)
Пример
Давайте преобразуем число типа i32
в число типа i64 с помощью метода
from:
fn main()
{
let res: i64 = i64::from(12345);
println!("{}", res);
}
Результат выполнения кода:
12345
Пример
Давайте преобразуем строку "abcde"
в тип String с помощью метода
from:
fn main()
{
let res = String::from("abcde");
println!("{}", res);
}
Результат выполнения кода:
"abcde"
Пример
Давайте реализуем трейт From для
собственной структуры, чтобы создавать её
из числа типа i32:
struct Number
{
value: i32,
}
impl From<i32> for Number
{
fn from(item: i32) -> Self
{
Number { value: item }
}
}
fn main()
{
let res = Number::from(12345);
println!("{}", res.value);
}
Результат выполнения кода:
12345
Пример
Так как трейт From автоматически даёт
реализацию трейта Into, то для
преобразования можно использовать метод
into:
fn main()
{
let num: i32 = 12345;
let res: i64 = num.into();
println!("{}", res);
}
Результат выполнения кода:
12345