我發現的現有答案都基於from_str
(如Reading in user input from console once efficiently),但顯然from_str(x)
已更改爲Rust 1.0中的x.parse()
。作爲新手,考慮到這一變化,原始解決方案應如何適應並不明顯。如何在Rust 1.0中讀取用戶的整數輸入?
從Rust 1.0開始,從用戶那裏獲取整數輸入的最簡單方法是什麼?
我發現的現有答案都基於from_str
(如Reading in user input from console once efficiently),但顯然from_str(x)
已更改爲Rust 1.0中的x.parse()
。作爲新手,考慮到這一變化,原始解決方案應如何適應並不明顯。如何在Rust 1.0中讀取用戶的整數輸入?
從Rust 1.0開始,從用戶那裏獲取整數輸入的最簡單方法是什麼?
在這裏,所有的可選類型的註釋和錯誤處理一個版本,這是對初學者也許有用的(比如我):
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寫:
// read until a whitespace and try to convert what was read into an i32
let i: i32 = read!();
注:但是,如果你需要不止一個值同時讀取,您可能需要防鏽夜間。
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."),
}
}
這裏有幾個可能性(鏽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);
}
}
這些備用模式匹配儀式不依賴於額外的庫。
來吧,它明顯不同,完整的答案使讀者更容易。 – qed
對我來說,它與[接受的答案](http://stackoverflow.com/a/30355925/155423)看起來很相似。 – Shepmaster
是的,你必須從用戶那裏獲取一個字符串並將其存儲在一個變量中,該部分是相同的。解析部分更簡潔,正如我的答案中所解釋的。 – qed
我認爲它運行穩定,如果你只需要一次讀取一個值。 –
'text_io' dev here。 @VladimirMatveev是對的,如果你沒有讀取元組,但是'read!()'調用只有一個值,'text_io'運行穩定。它實際上每晚都需要多個值。我會更新github描述。 –