Rust - ParseIntError { kind: PosOverflow }

Рейтинг: 0Ответов: 1Опубликовано: 10.04.2023

Есть код который проверяет является ли число палиндромом. Но возникли проблемы с unwrap() - Result::unwrap() on an Err value: ParseIntError { kind: PosOverflow }

let x = 1234567899;
println!("{}",x.to_string().trim().chars().rev().collect::<String>().parse::<i32>().unwrap() == x);

Ответы

▲ 1Принят

Если явно написать достаточно большой литерал числа, компилятор предупредит ошибкой еще на первой строке:

error: literal out of range for `i32`
 --> src/main.rs:4:13
  |
4 |     let x = 9987654321;
  |             ^^^^^^^^^^
  |
  = note: the literal `9987654321` does not fit into the type `i32` whose range is `-2147483648..=2147483647`
  = help: consider using the type `i64` instead

В Rust есть несколько целочисленных типов. По умолчанию, если не указано иное, для целочисленных литералов используется i32. Он, как видно из текста ошибки, ограничен по размеру. Для числа 9987654321 потребуется тип i64, неотрицательный u64 или их более ёмкие собратья.

fn main() {
    let x = 1234567899;
    println!("{}", x.to_string().chars().rev().collect::<String>().parse::<i64>().unwrap() == x);
}