Escape from the Memories Planet

思い出星職人をめざし、かつ、とどまらないブログ

Rust標準入力マクロ置いとく

めちゃくちゃ投稿に間が空いてしまった、、、まぁQiitaの記事にするほどでもない内容を置くという方針なのでこっちの方にめったに投稿がないのは別に問題ないはず...ないはず

namniumと申します。はい。今回は競プロでRustのコードを書いていたら、標準入力用のマクロを副産物で作成してしまったので、ここに置いておこうと考えた次第です。

ガバコードなので「こういうのもあるんだ」程度にお願いします。

macro_rules! scan {
    ( $( $x:ident ),*; $t:ty ) => {
        let mut buf = String::new();
        let mut itr = {
            while buf.trim().len() == 0 {
                buf = String::new();
                std::io::stdin().read_line(&mut buf).unwrap();
            }
            buf.split_whitespace().map(|n| n.parse::<$t>().unwrap())
        };
        $(
            let $x = itr.next().unwrap();
        )*
    };
    ( $( $x:ident ),*; String ) => {
        let mut buf = String::new();
        let mut itr = {
            while buf.trim().len() == 0 {
                buf = String::new();
                std::io::stdin().read_line(&mut buf).unwrap();
            }
            buf.split_whitespace()
        };
        $(
            let $x = String::from(itr.next().unwrap());
        )*
    };
}

use std::io::prelude::*;

fn print(message: &str) {
    print!("{}", message);
    std::io::stdout().flush().unwrap();
}

fn main() {
    print("a b? ");
    scan!(a, b; i32);
    println!("{} + {} = {}", a, b, a+b);

    print("What's your name(fisrtname familyname) ? ");
    scan!(first, family; String);

    println!("Your name is {} {} in Japan.", family, first);
}

実行結果例

$ ./main
a b? 10 20
10 + 20 = 30
What's your name(fisrtname familyname) ? Taro Yamada
Your name is Yamada Taro in Japan.

あー、解説とか面倒くさいのでしません。この前作ったRustテトリスでも置いておいてお茶を濁します...(記事とは全く無関係)

https://tetris-by-rust-wasm.firebaseapp.com/