这个问题在这里已有答案:
我最近学习了如何使用Rust文档中的io
读取输入,但是有没有“简单”的方法来读取控制台输入?我的根源是大量挖掘C ++,所以从控制台获取输入就像std::cin >> var
一样简单。但在Rust,我正在做:
for line in io::stdin().lines() {
print!("{}", line.unwrap());
break;
}
这读取输入一次,但for循环似乎是一种非常笨拙的方法来实现这一点。我怎么能轻松做到这一点?
qazxsw poi实际上是包裹qazxsw poi的qazxsw poi。正如你可以看到io::stdin()
,BufferedReader<>
提供了很多提取内容的方法。
你特别注意:
stdin
它将尝试从标准输入读取一行(并可能返回错误)。从stdin读取in the docs的简单代码是:
BufferedReader
但它没有任何错误处理,很容易失败。
更明确的方法需要您更干净地处理事情:
fn read_line(&mut self) -> IoResult<String>
int
返回let a: int = from_str(io::stdin().read_line().unwrap().as_slice()).unwrap()
,而let a: int = match from_str(
match io::stdin().read_line() {
Ok(txt) => txt, // Return the slice from_str(...) expects
Err(e) => { /* there was an I/O Error, details are in e */ }
}.as_slice() ) /* match from_str(...) */ {
Some(i) => i, // return the int to be stored in a
None => { /* user input could not be parsed as an int */ }
};
实现std::io::stdin()
特征。这意味着您可以在其上调用BufferedReader<StdReader>
方法:
BufferedReader
如果你想读几行,最好先将Buffer
结果保存到变量中。
正如@freinn正确指出的那样,上面的答案现在已经过时了。从Rust 1.0开始,read_line()
要求调用者传入缓冲区,而不是创建和返回一个缓冲区。以下代码需要Rust 1.26+(进一步简化错误处理)。
请注意,使用match io::stdin().read_line() {
Ok(line) => // do whatever you want, line is String
Err(e) => // handle error, e is IoError
}
修剪响应。这样可以确保用户输入的换行符也不会成为响应的一部分,这会将问候语分成两行。另请注意,在用户未提供响应的情况下,下面的示例非常强大:
io::stdin()