Трейт TryFrom
Трейт TryFrom выполняет преобразование
значения одного типа в значение другого типа
с проверкой. Если преобразование невозможно,
возвращается ошибка в виде Err.
Параметром трейт принимает значение,
которое нужно преобразовать. Результатом
работы метода try_from является
Result: Ok при успешном
преобразовании или Err при невозможности
выполнить преобразование.
Трейт TryFrom является безопасной
альтернативой трейту From, когда
преобразование может завершиться неудачей.
Например, при преобразовании большого числа
в более узкий тип данные могут не поместиться.
Синтаксис
impl TryFrom<Source> for Target
{
type Error = ErrorType;
fn try_from(value: Source) -> Result<Self, Self::Error>
{
// conversion logic
}
}
Пример
Давайте преобразуем число i32 в тип
u8. Если число помещается в диапазон
u8 (от 0 до 255), преобразование
пройдёт успешно:
use std::convert::TryFrom;
fn main()
{
let num: i32 = 100;
let res = u8::try_from(num);
println!("{:?}", res);
}
Результат выполнения кода:
Ok(100)
Пример
А теперь попробуем преобразовать число
i32, которое не помещается в диапазон
u8. В этом случае вернётся ошибка:
use std::convert::TryFrom;
fn main()
{
let num: i32 = 500;
let res = u8::try_from(num);
println!("{:?}", res);
}
Результат выполнения кода:
Err(TryFromIntError(()))
Пример
Давайте обработаем результат преобразования
с помощью match, чтобы вывести
понятное сообщение об успехе или ошибке:
use std::convert::TryFrom;
fn main()
{
let num: i32 = 200;
match u8::try_from(num)
{
Ok(val) => println!("Success: {}", val),
Err(e) => println!("Error: {:?}", e),
}
}
Результат выполнения кода:
Success: 200