Трейт TryInto
Трейт TryInto представляет собой пару к трейту
TryFrom и позволяет преобразовывать значение
одного типа в другой тип, если преобразование может
завершиться ошибкой. В отличие от трейта Into,
который выполняет преобразование, гарантированно
успешное, TryInto возвращает результат типа
Result, что даёт возможность обработать
ситуацию, когда преобразование невозможно.
Трейт TryInto является обобщённым над
целевым типом. Метод try_into принимает
значение self и возвращает
Result<T, Self::Error>, где T - это
целевой тип, в который выполняется преобразование,
а Self::Error - тип ошибки. Если
преобразование прошло успешно, возвращается
Ok с преобразованным значением. Если
преобразование невозможно, возвращается
Err с описанием ошибки.
Обычно TryInto не реализуют напрямую.
Вместо этого реализуют трейт TryFrom,
а реализация TryInto появляется
автоматически благодаря обобщённой реализации в
стандартной библиотеке.
Синтаксис
fn try_into(self) -> Result<T, Self::Error>
Пример
Давайте попробуем преобразовать число типа i32
в тип u8. Поскольку число 100
помещается в диапазон u8, преобразование
пройдёт успешно:
fn main()
{
let num: i32 = 100;
let res: Result<u8, _> = num.try_into();
println!("{:?}", res);
}
Результат выполнения кода:
Ok(100)
Пример
А теперь попробуем преобразовать число 300
типа i32 в тип u8. Это число
больше максимального значения u8, поэтому
преобразование вернёт ошибку:
fn main()
{
let num: i32 = 300;
let res: Result<u8, _> = num.try_into();
println!("{:?}", res);
}
Результат выполнения кода:
Err(TryFromIntError(()))
Пример
Давайте обработаем результат преобразования с
помощью match, чтобы вывести разные
сообщения в зависимости от успеха операции:
fn main()
{
let num: i32 = 300;
let res: Result<u8, _> = num.try_into();
match res
{
Ok(val) => println!("Success: {}", val),
Err(_) => println!("Conversion failed"),
}
}
Результат выполнения кода:
Conversion failed
Пример
Трейт TryInto также работает с
Vec и массивами. Давайте преобразуем
вектор в массив фиксированной длины:
fn main()
{
let v = vec![1, 2, 3, 4, 5];
let res: Result<[i32; 5], _> = v.try_into();
match res
{
Ok(arr) => println!("{:?}", arr),
Err(_) => println!("Conversion failed"),
}
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Пример
Если длина вектора не совпадает с длиной массива, преобразование завершится ошибкой:
fn main()
{
let v = vec![1, 2, 3];
let res: Result<[i32; 5], _> = v.try_into();
match res
{
Ok(arr) => println!("{:?}", arr),
Err(_) => println!("Conversion failed"),
}
}
Результат выполнения кода:
Conversion failed