6

Rust で作成した単純な関数にコマンドライン引数を渡すようにユーザーに求めています。int::from_str(args[1])を使用して変換できることはわかっていますがOption<int>、これは を返します。つまり、以下のように を受け取る関数に渡すには、ステートメントintを使用する必要があります。matchただし、引数がn 個の場合、2^ nの可能性があります。何かで一連のネストされたmatchステートメントを書くのはひどいことです。次のような方法があれば理想的です。

// will return either Some(int) or None
let start = int::from_str(args[1]), end = int::from_str(args[2]);
if typeof(start) == Some && typeof(end) == Some { 
    println(fmt!("You entered: %d, %d", start, end); 
} else { 
    println("Error with arguments."); 
}

そのような方法はありますか?これにより、列挙型のどのメンバーが他にあるかをテストできますmatchか?

4

1 に答える 1

7

列挙型のバリアントはすべて同じ型 (この場合はNoneSome(foo)areの両方Option<int>) であるため、実際に実行したいことは、バリアントstartendがどちらであるかを確認することです。幸い、Rust にはいくつかのオプションがあります。

コードを直接翻訳すると、start.is_some() && end.is_some(). ただし、これにはフォーマット文字列を に変更する必要がありますfmt!("You entered: %d, %d", start.get(), end.get())startendは整数ではありませんが、Some(...)バリアントでラップされているためです。(このバリアント テストは、列挙型ごとに記述する必要があるものです。任意の列挙型に対してテストを実行できる組み込み関数はありません。)

より慣用的な方法は次のようになります。

// will return either Some(int) or None
let start_opt = int::from_str(args[1]), end_opt = int::from_str(args[2]);
match (start_opt, end_opt) { 
    // only matches if both are Some
    (Some(start), Some(end)) => println(fmt!("You entered: %d, %d", start, end),

    // will match when either (or both) are None
    _                        => println("Error with arguments.");
}
于 2013-06-10T00:17:51.663 に答える