Rust 如何有效地从控制台读取单行用户输入?

Rust 如何有效地从控制台读取单行用户输入?,rust,Rust,我最近从Rust文档中学习了如何使用io读取输入,但是有没有“简单”的方法来读取控制台输入?我的根被大量挖掘成C++,所以从控制台抓取输入与 STD::CIN > var > /COD>一样容易。但在《铁锈》中,我做到了: for line in io::stdin().lines() { print!("{}", line.unwrap()); break; } 这会读取一次输入,但for循环似乎是一种非常笨拙的方法。如何轻松地执行此操作?返回BufferedReader,并

我最近从Rust文档中学习了如何使用
io
读取输入,但是有没有“简单”的方法来读取控制台输入?我的根被大量挖掘成C++,所以从控制台抓取输入与<代码> STD::CIN > var > /COD>一样容易。但在《铁锈》中,我做到了:

for line in io::stdin().lines() {
    print!("{}", line.unwrap());
    break;
}
这会读取一次输入,但for循环似乎是一种非常笨拙的方法。如何轻松地执行此操作?

返回
BufferedReader
,并实现trait。这意味着您可以对其调用方法:

match io::stdin().read_line() {
    Ok(line) => // do whatever you want, line is String
    Err(e) =>   // handle error, e is IoError
}
如果要读取几行,最好先将结果保存到变量中。

io::stdin()
io::stdin()实际上是一个
BufferedReader
包装
stdin
。如您所见,
BufferedReader
提供了许多提取内容的方法

值得注意的是:

fn read_line(&mut self) -> IoResult<String>
但它不需要任何错误处理,并且很容易失败

更明确的方法要求您更干净地处理事情:

let a: isize = 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 */ }
    };

正如@freinn正确指出的那样,上面的答案现在已经过时了。从Rust 1.0开始,
read_line()
要求调用方传入缓冲区,而不是创建并返回缓冲区的函数。以下代码需要Rust 1.26+(进一步简化错误处理)

注意:使用
trim\u end()
修剪响应。这确保了用户输入的换行符不会成为响应的一部分,这会将问候语分成两行。 另请注意,以下示例在用户未提供响应的情况下是可靠的:

使用std::io::stdin;
类型Result=std::Result::Result;
fn main()->结果{
println!(“你好,你叫什么名字?”;
让mut buffer=String::new();
stdin().read_line(&mut buffer);/“啊,我可以尊重你保持匿名的愿望。”.to_owned(),
name=>format!(“你好,{}。很高兴认识你!”,name),
};
普林顿!(“{}”,res);
好(())
}

Rust告诉我,
txt
的寿命不够长,无法在第二个实现的下一个块中进行匹配,我如何才能克服这个问题?更不用说修复了,as_slice()必须移动到第一个匹配的末尾statement@SyntacticFructose哦,是的,真的,接得好!现在,read_line函数需要一个参数,一个字符串的可变引用。有关更多信息,请单击。
let a: isize = 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 */ }
    };