为了学习Rust,我正在研究HackerRank 30天挑战,Project Euler和其他编程竞赛.我的第一个障碍是从一行标准输入读取多个整数.
在C++中我可以方便地说:
cin >> n >> m;
Run Code Online (Sandbox Code Playgroud)
我如何在Rust中以惯用方式执行此操作?
据我所知,最好的方法是分割输入行,然后将它们映射到整数,如下所示:
use std::io;
let mut line = String::new();
io::stdin().read_line(&mut line).expect("Failed to read line");
let inputs: Vec<u32> = line.split(" ")
.map(|x| x.parse().expect("Not an integer!"))
.collect();
// inputs is a Vec<u32> of the inputs.
Run Code Online (Sandbox Code Playgroud)
请注意,panic!如果输入无效,则会出现这种情况; 如果你想避免这种情况,你应该正确处理结果值.
您可以使用scan-rules crate ( docs ),它使这种扫描变得容易(并且具有使其功能强大的功能)。
下面的示例代码使用scan-rules版本 0.1.3(文件可以直接用 cargo-script 运行)。
示例程序在同一行接受两个由空格分隔的整数。
// cargo-deps: scan-rules="^0.1"
#[macro_use]
extern crate scan_rules;
fn main() {
let result = try_readln! {
(let n: u32, let m: u32) => (n, m)
};
match result {
Ok((n, m)) => println!("I read n={}, m={}", n, m),
Err(e) => println!("Failed to parse input: {}", e),
}
}
Run Code Online (Sandbox Code Playgroud)
测试运行:
4 5
I read n=4, m=5
5 a
Failed to parse input: scan error: syntax error: expected integer, at offset: 2
Run Code Online (Sandbox Code Playgroud)