【发布时间】:2015-07-05 21:54:18
【问题描述】:
我一直在尝试找到一种在 Rust 中读取变量的简单方法,但到目前为止还没有任何运气。 Rust Book 中的所有示例都处理字符串 AFAIK,我找不到任何有关整数或浮点数的东西。
【问题讨论】:
-
The Rust Programming Language, chapter 3.1 — Guessing game: 字符串上的
parse()方法将字符串解析为某种数字
我一直在尝试找到一种在 Rust 中读取变量的简单方法,但到目前为止还没有任何运气。 Rust Book 中的所有示例都处理字符串 AFAIK,我找不到任何有关整数或浮点数的东西。
【问题讨论】:
parse() 方法将字符串解析为某种数字
我在这台机器上没有 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() 的类型限定符 (::<i32>),其中类型可以从分配中推断出来。
【讨论】:
unwrap_or 会更习惯用法:input_string.parse::<i32>().unwrap_or(-1)。您也可以使用它来指定整数类型:input_string.parse().unwrap_or(-1i32).
unwrap_or 对我来说似乎不那么惯用,但如果这是社区的摇摆方式,它对我有用。
要读取用户输入,您总是读取一组字节。有时,您可以将这些字节解释为 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
【讨论】:
一组字节组成一个输入。在 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);
}
这是一种更长的方法,但更好地处理错误以及输入和解析数字。
【讨论】: