LoginSignup
3
2

More than 3 years have passed since last update.

RustでC++のcin >> aを実現する

Last updated at Posted at 2020-04-25

概要

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);

注意事項

このコードは現在usizeStringのみに対応しています.他の型が必要なら適宜関数を追加する必要があります.
ジェネリクスを用いるように修正しました.String::parse<type>できる型で使えるようになりました.

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2