【Rust】コンソールにて数値を入力し、matchを用いて結果をprintにて出力させる方法

前回ではコンソールにて文字列を入力し出力するやり方を書きました。

 

今回はRustプロジェクトにおいて、コンソールにて何かしら入力した数値を元に、それぞれ異なる出力結果を表示する方法を説明します。

なお例のごとく、C++と合わせていきたいと思います。

 

1: C++での書き方

2: Rustでの書き方

3: 入力処理の関数化

 

 


C++での書き方】

C++では文字列も数値も、 cin を用いる事で解決出来ます。

 

#include <iostream>

using namespace std;

int main() {
    int answer;
    cout << "0 〜 9 から1つ数値を選んで入力して下さい:\n";
    cin >> answer;

    switch (answer) {
	case 1:
	    cout << "ゲーム01を開始します。" << endl;
	    break;
	case 2:
	    cout << "ゲーム02を開始します。" << endl;
	    break;
	case 3:
	    cout << "ゲーム03を開始します。" << endl;
	    break;
	default:
	    cout << "終了します。" << endl;
	    break;
    }

    return 0;
}

 

フィルターを掛けてないので数字以外の文字も受け付けてしまいますが、ご了承下さい。出力結果は下記となります。

0 〜 9 から1つ数値を選んで入力して下さい:
1
ゲーム01を開始します。

1 〜 3 以外の数字や文字列では下記結果になります。

0 〜 9 から1つ数値を選んで入力して下さい:
7
終了します。

 

 


【Rustでの書き方】

ではRustで同じ処理を行なえる様に書いてみます。

 

use std::io;

fn main() {
    println!("0 〜 9 から1つ数値を選んで入力して下さい:");
    let mut number = String::new();
    io::stdin().read_line(&mut number).ok();
    let answer = number.trim().parse().ok().unwrap();

    match answer {
        1 => println!("ゲーム01を開始します。"),
        2 => println!("ゲーム02を開始します。"),
        3 => println!("ゲーム03を開始します。"),
        _ => println!("終了します。"),
    }
}

match を使用しました。ポイントとなる部分を説明していきます。

 

let mut number = String::new();

コンソールからの入力はあくまで文字なので、いずれ数値に置き換えるとしても、まずはString型でミュータブル変数を作成する必要があります。

 

let answer = number.trim().parse().ok().unwrap();

今回は文字列ではなく数値に変換してanswer変数に格納したいので、parse() 関数を用います。よって、もし数値以外の文字等を入力した場合はエラーとなり、処理が終了します。例外処理をシステム側で行なってくれる訳ですね。

 

出力結果はC++の時と同じになると思います。

 

 


【入力処理の関数化】

この処理も関数化して使いやすくしてみましょう。

 

use std::io;

fn main() {
    println!("0 〜 9 から1つ数値を選んで入力して下さい:");
    let answer01 = get_input();

    println!("再度、数値を入力して下さい:");
    let answer02 = get_input();

    match answer01 {
        1 => println!("ゲーム01を選択。プレイ時間は{}分です。", answer02),
        2 => {
            let num01 = 4;
            println!("ゲーム02を選択。 {} + {} = {}", num01
                                                , answer02
                                                , num01 + answer02);
        },
        3 => {
            print!("ゲーム03を選択。 ");
            println!("answer02 = {} です。", answer02);
        },
        _ => println!("終了します。"),
    }
}

fn get_input() -> i32 {
    let mut number = String::new();
    io::stdin().read_line(&mut number).ok();
    return number.trim().parse().ok().unwrap();
}

get_input() 関数にて、戻り値の型を i32 や usize 等にします。

 

3 => {
    print!("ゲーム03を選択。 ");
    println!("answer02 = {} です。", answer02);
},

また、match の各パターン内において複数の処理を行ないたい場合は、『 { } 』で全体を括る事で解決出来ます。

出力結果の一例は下記となります。

0 〜 9 から1つ数値を選んで入力して下さい:
2
再度、数値を入力して下さい:
36
ゲーム02を選択。 4 + 36 = 40

 

同じく、プログラミングのスキルチェック等での課題でお役に立てればと。

 

以上です。