【问题标题】:Reading an integer from input and assigning it to a variable从输入中读取整数并将其分配给变量
【发布时间】:2015-07-05 21:54:18
【问题描述】:

我一直在尝试找到一种在 Rust 中读取变量的简单方法,但到目前为止还没有任何运气。 Rust Book 中的所有示例都处理字符串 AFAIK,我找不到任何有关整数或浮点数的东西。

【问题讨论】:

标签: input integer rust


【解决方案1】:

我在这台机器上没有 Rust 编译器,但部分基于接近的 this answer,你想要类似...

let user_val = match input_string.parse::<i32>() {
    Ok(x) => x,
    Err(_) => -1,
};

或者,正如 cmets 中所指出的,

let user_val = input_string.parse::<i32>().unwrap_or(-1);

...尽管您在整数大小和默认值方面的选择可能明显不同,并且您并不总是需要 parse() 的类型限定符 (::&lt;i32&gt;),其中类型可以从分配中推断出来。

【讨论】:

  • 你不需要为这样的事情安装编译器 - Rust playpen 已经涵盖了。
  • 在这里使用unwrap_or 会更习惯用法:input_string.parse::&lt;i32&gt;().unwrap_or(-1)。您也可以使用它来指定整数类型:input_string.parse().unwrap_or(-1i32).
  • @Shepmaster,都很有趣,谢谢! unwrap_or 对我来说似乎不那么惯用,但如果这是社区的摇摆方式,它对我有用。
【解决方案2】:

要读取用户输入,您总是读取一组字节。有时,您可以将这些字节解释为 UTF-8 字符串。然后,您可以将字符串进一步解释为整数或浮点数(或许多其他内容,如 IP 地址)。

以下是读取单行输入并将其解析为 32 位有符号整数的完整示例:

use std::io;

fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Not a valid string");
    let input_num: i32 = input.trim().parse().expect("Not a valid number");
    println!("Your number plus one is {}", input_num + 1);
}

请注意,不会进行用户友好的错误处理。如果读取输入或解析失败,程序只会出现恐慌。运行程序会产生:

$ ./input
41
Your number plus one is 42

【讨论】:

    【解决方案3】:

    一组字节组成一个输入。在 Rust 中,您接受输入为 UTF-8 String。然后将字符串解析为整数或浮点数。以简单的方式,您接受字符串并解析它,然后为两者编写一个 expect`` 语句,以向用户显示一条消息,当程序在运行时发生恐慌时出了什么问题。

    fn main() {
        let mut x = String::new();
        std::io::stdin().read_line(&mut x)
            .expect("Failed to read input.");
        let x: u32 = x.trim().parse()
            .expect("Enter a number not a string.");
        println!("{:?}", x);
    }
    

    如果程序无法解析输入字符串,则会出现恐慌并显示错误消息。请注意,程序仍然出现恐慌,我们没有完美地处理错误。需要注意的另一件事是,我们可以使用相同的变量名称 x 而不是某些 x_int 因为变量阴影功能。为了更好地处理错误,我们可以使用match 构造。

    fn main() {
        let mut x = String::new();
        match std::io::stdin().read_line(&mut x) {
            Ok(_) => println!("String has been taken in."),
            Err(_) => {
                println!("Failed to read input.");
                return;
            },
        };
        let x: u32 = match x.trim().parse() {
            Ok(n) => {
                println!("Converted string to int.");
                n
            },
            Err(_) => {
                println!("Failed to parse.");
                return;
            },
        };
        println!("{:?}", x);
    }
    

    这是一种更长的方法,但更好地处理错误以及输入和解析数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 2016-06-14
      • 2021-08-13
      • 2019-12-22
      • 2019-05-24
      • 2018-08-22
      • 1970-01-01
      相关资源
      最近更新 更多