はじめに
この実験では、Rust でのパターンマッチングを使った引数解析の例を示します。このプログラムはコマンドライン引数を受け取り、渡された引数の数と型に基づいて異なる操作を行います。引数が渡されなければ、メッセージを表示します。引数が 1 つだけ渡され、それが整数 42 として解析できる場合、「これが答えです!」と表示します。コマンドと整数引数が渡された場合、整数に対して増加または減少操作を行います。それ以外の数の引数が渡された場合、プログラムの正しい使い方を説明するヘルプメッセージを表示します。
注: 実験でファイル名が指定されていない場合は、好きなファイル名を使うことができます。たとえば、
main.rsを使って、rustc main.rs &&./mainでコンパイルして実行することができます。
引数解析
マッチングを使って簡単な引数を解析することができます。
use std::env;
fn increase(number: i32) {
println!("{}", number + 1);
}
fn decrease(number: i32) {
println!("{}", number - 1);
}
fn help() {
println!("usage:
match_args <string>
与えられた文字列を答えとしているかどうかを確認します。
match_args {{increase|decrease}} <integer>
与えられた整数を 1 増やすか減らします。");
}
fn main() {
let args: Vec<String> = env::args().collect();
match args.len() {
// 引数が渡されていない
1 => {
println!("私の名前は'match_args' です。いくつかの引数を渡してみてください!");
},
// 1 つの引数が渡された
2 => {
match args[1].parse() {
Ok(42) => println!("これが答えです!"),
_ => println!("これは答えではありません。"),
}
},
// 1 つのコマンドと 1 つの引数が渡された
3 => {
let cmd = &args[1];
let num = &args[2];
// 数値を解析する
let number: i32 = match num.parse() {
Ok(n) => {
n
},
Err(_) => {
eprintln!("エラー: 2 番目の引数は整数ではありません");
help();
return;
},
};
// コマンドを解析する
match &cmd[..] {
"increase" => increase(number),
"decrease" => decrease(number),
_ => {
eprintln!("エラー: 無効なコマンド");
help();
},
}
},
// その他のすべてのケース
_ => {
// ヘルプメッセージを表示する
help();
}
}
}
$./match_args Rust
これは答えではありません。
$./match_args 42
これが答えです!
$./match_args do something
エラー: 2 番目の引数は整数ではありません
usage:
match_args <string>
与えられた文字列を答えとしているかどうかを確認します。
match_args {{increase|decrease}} <integer>
与えられた整数を 1 増やすか減らします。
$./match_args do 42
エラー: 無効なコマンド
usage:
match_args <string>
与えられた文字列を答えとしているかどうかを確認します。
match_args {{increase|decrease}} <integer>
与えられた整数を 1 増やすか減らします。
$./match_args increase 42
43
まとめ
おめでとうございます!引数解析の実験を完了しました。スキルを向上させるために、LabEx でさらに多くの実験を行って練習してください。