概要
Rustの標準入力が面倒だったのでC++のcin >> a
と似たような動作をするstructを作りました.
環境
Rust 1.42
実装
struct Input {
data: Vec<String>,
}
impl Input {
pub fn new() -> Input {
Input{data: Vec::new()}
}
fn read(&mut self) {
let mut line: String = String::new();
std::io::stdin().read_line(&mut line).unwrap();
self.data = line.split_whitespace().rev().map(|s| s.parse::<String>().unwrap()).collect::<Vec<_>>();
}
pub fn get<T: core::str::FromStr>(&mut self) -> T {
if self.data.len() == 0 {
self.read();
}
return self.data.pop().unwrap().parse::<T>().ok().unwrap();
}
}
impl<T: core::str::FromStr> std::ops::Shr<&mut T> for Input {
type Output = Input;
fn shr(mut self, rhs: &mut T) -> Input {
*rhs = self.get::<T>();
return self;
}
}
使い方
次のように使います.このコードはこの問題の入力を想定しています.
let mut cin = Input::new();
let mut a: usize = 0;
let mut b: usize = 0;
let mut c: usize = 0;
let mut s = String::new();
cin = cin >> &mut a >> &mut b >> &mut c >> &mut s;
println!("{} {}", a + b + c, s);
注意事項
このコードは現在usize
とString
のみに対応しています.他の型が必要なら適宜関数を追加する必要があります.
ジェネリクスを用いるように修正しました.String::parse<type>
できる型で使えるようになりました.