7

私はRustを学んでいて、とても面白そうです。私はまだ「一致」にあまり慣れていませんが、かなり統合されているようです。次のコード (以下) を使用して、次の行「_」の代わりにコメントアウトされた行「None」を含む文字列を i64 に変換していました。アンダースコアなしの不一致の場合はどうなるか、または「なし」がキャッチオールになる可能性があるかどうか疑問に思いました。calling-code には正の i64 が必要なので、負の結果は無効な入力になります (この場合)。おそらく構造体を使用する以外に、この例を使用してリターンでエラーを示すことができるかどうかはわかりません。

  1. マッチアイテムとしてアンダースコアがない場合、「なし」はすべてをキャッチしますか?アンダースコアの代わりに使用できますか?

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

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

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

コード例:

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

1 に答える 1

10
  1. マッチアイテムとしてアンダースコアがない場合、「なし」はすべてをキャッチしますか?アンダースコアの代わりに使用できますか?

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

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

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

Options と Results を使用するには、構造体を返す必要があります。

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

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

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

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

関数を記述する多くの方法のうちの 3 つを次に示します。

// 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!")
于 2013-10-26T10:02:25.557 に答える