Как прочитать целочисленный ввод от пользователя в Rust 1.0?

существующие ответы, которые я нашел, основаны на from_str (например,чтение пользовательского ввода с консоли один раз эффективно), но, видимо,from_str(x) был изменен на x.parse() в Rust 1.0. Как Новичок, не очевидно, как оригинальное решение должно быть адаптировано с учетом этого изменения.

начиная с Rust 1.0, каков самый простой способ получить целочисленный ввод от пользователя?

4 ответов


вот версия со всеми необязательными аннотациями типа и обработкой ошибок, которые могут быть полезны для начинающих, таких как я:

use std::io;

fn main() {
    let mut input_text = String::new();
    io::stdin()
        .read_line(&mut input_text)
        .expect("failed to read from stdin");

    let trimmed = input_text.trim();
    match trimmed.parse::<u32>() {
        Ok(i) => println!("your integer input: {}", i),
        Err(..) => println!("this was not an integer: {}", trimmed),
    };
}

вероятно, самой простой частью было бы использовать text_io crate и пишем:

#[macro_use]
extern crate text_io;

fn main() {
    // read until a whitespace and try to convert what was read into an i32
    let i: i32 = read!();
    println!("Read in: {}", i);
}

Если вам нужно прочитать больше чем одно значение одновременно, то вы могли использовать ржавчину ночную.


parse более или менее то же самое; это read_line теперь это неприятно.

use std::io;

fn main() {
    let mut s = String::new();
    io::stdin().read_line(&mut s).unwrap();

    match s.trim_right().parse::<i32>() {
        Ok(i) => println!("{} + 5 = {}", i, i + 5),
        Err(_) => println!("Invalid number."),
    }
}

вот несколько возможностей (Rust 1.7):

use std::io;

fn main() {
    let mut n = String::new();
    io::stdin()
        .read_line(&mut n)
        .expect("failed to read input.");
    let n: i32 = n.trim().parse().expect("invalid input");
    println!("{:?}", n);

    let mut n = String::new();
    io::stdin()
        .read_line(&mut n)
        .expect("failed to read input.");
    let n = n.trim().parse::<i32>().expect("invalid input");
    println!("{:?}", n);

    let mut n = String::new();
    io::stdin()
        .read_line(&mut n)
        .expect("failed to read input.");
    if let Ok(n) = n.trim().parse::<i32>() {
        println!("{:?}", n);
    }
}

Это избавит вас от церемонии сопоставления шаблонов без зависимости от дополнительных библиотек.