РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
81 of 1245 menu

Трейт 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

Смотрите также

  • трейт TryFrom,
    который выполняет преобразование с возможностью ошибки
  • трейт Into,
    который выполняет безошибочное преобразование между типами
  • трейт From,
    который создаёт значение одного типа из другого
  • метод try_into,
    который выполняет преобразование с проверкой
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить