2013-10-26 4 views
6

私は錆を学んでいて、とても面白いですね。私はまだ "マッチ"に精通していませんが、それはかなり積分されているように見えます。私は、次の行 "_"の代わりにコメントアウトされた行 "None"を含むStringをi64に変換するために、以下のコード(下記)を使用していました。私は、アンダースコアなしの不一致の場合、または「なし」がキャッチオールかもしれないかどうかについて何が起こったのか疑問に思った。呼び出しコードには正のi64が必要です。したがって、負の値は無効な入力(この場合)になります。おそらく構造体を使用している以外のこの例を使用して戻り値にエラーを示すことが可能かどうかはわかりません。何も一致しない場合、 "マッチ"を使ってRustでどうなりますか?

  1. 一致する項目としてアンダースコアを使用しない場合、「なし」はすべてをキャッチし、アンダースコアの代わりに使用できますか?

  2. 構造体を戻り値として使用せずに、このような関数でエラーを返すことはできますか?

  3. 一般に、「マッチ」を使用して不一致が発生する可能性はありますか?その場合はどうなりますか?

  4. 下の例では、アンダースコアの使用と「なし」の使用に違いはありますか?

例コード:

fn fParseI64(sVal: &str) -> i64 { 
    match from_str::<i64>(sVal) { 
     Some(iVal) => iVal, 
//  None => -1 
    _ => -1  
    } 
} 

答えて

8
  1. 一致項目としてアンダースコアがなければ、 "なし" のすべてをキャッチしません、それは代わりにアンダースコアを使用することができますか?

この場合、はいです。 Option<T>の場合は、Some<T>またはNoneの2つしかありません。 すでにのすべての値が一致していますので、が残っています。 Noneは、_とまったく同じように動作します。

  2.構造体を戻り値として使用せずに、このような関数でエラーを返すことはできますか?

私はあなたがエラーを処理するためにすべての可能な方法を理解するために、この詳細なガイドを読んでお勧めしたい - http://static.rust-lang.org/doc/master/tutorial-conditions.html

オプションおよび結果を用いて構造体を返すために、あなたが必要になります。

  3.一般に、「マッチ」を使用して不一致が発生する可能性はありますか?その場合はどうなりますか?

すべての可能なケースが処理されることを保証できない場合、錆はmatchをコンパイルしません。すべての可能性にマッチしない場合は、_句が必要です。

  4.下の例では、アンダースコアの使用と「なし」の使用に違いはありますか?

いいえ#1を参照してください。

// Returns -1 on wrong input. 
fn alt_1(s: &str) -> i64 { 
    match from_str::<i64>(s) { 
    Some(i) => if i >= 0 { 
     i 
    } else { 
     -1 
    }, 
    None => -1 
    } 
} 

// Returns None on invalid input. 
fn alt_2(s: &str) -> Option<i64> { 
    match from_str::<i64>(s) { 
    Some(i) => if i >= 0 { 
     Some(i) 
    } else { 
     None 
    }, 
    None => None 
    } 
} 

// Returns a nice message describing the problem with the input, if any. 
fn alt_3(s: &str) -> Result<i64, ~str> { 
    match from_str::<i64>(s) { 
    Some(i) => if i >= 0 { 
     Ok(i) 
    } else { 
     Err(~"It's less than 0!") 
    }, 
    None => Err(~"It's not even a valid integer!") 
    } 
} 

fn main() { 
    println!("{:?}", alt_1("123")); 
    println!("{:?}", alt_1("-123")); 
    println!("{:?}", alt_1("abc")); 

    println!("{:?}", alt_2("123")); 
    println!("{:?}", alt_2("-123")); 
    println!("{:?}", alt_2("abc")); 

    println!("{:?}", alt_3("123")); 
    println!("{:?}", alt_3("-123")); 
    println!("{:?}", alt_3("abc")); 
} 

出力::非常に説明に見える

123i64 
-1i64 
-1i64 
Some(123i64) 
None 
None 
Ok(123i64) 
Err(~"It's less than 0!") 
Err(~"It's not even a valid integer!") 
+0

おかげで、ここで

は、あなたがあなたの関数を書くことができる多くの方法の3です。私は与えられた例を試してみる。 –

関連する問題