2016-08-19 5 views
1

私はCやC++のような言語に非常に精通しているプログラマですが、本質的に機能的なものはほとんど経験していません。私はRustを学びようとしており、Rustがパターンをどのように定義しているのか、match式と一致するパターンがRustにあるのかを知りたいと思います。錆のパターンの定義とパターンマッチングは何ですか?

+1

[書籍](https://doc.rust-lang.org/book/patterns.html)は –

+0

本は私の後藤源だった、それがすべてで私のために計算していなかっただけと説明しています。私はそれを誤解していて、私の推理のためにはそれほど深くはない。 – TheRenegade

+0

@TheRenegadeあなたは本の問題を開くべきです。あなたがそれを理解しておらず、何が間違っているのか説明できれば、本自体は改善され、**みんなは利益を得ることができます**。 – Shepmaster

答えて

5

多くの種類のパターンがRustに存在します。最も注目すべきものは、

  • 42のようなリテラルです。これらは指定された値と一致します。したがって、​​を実行すると、f()が返された場合42件が入力されます。
  • xなどの識別子。これは何でも一致し、一致した値をxに割り当てます。したがって、次のコードでは:

    match f() { 
        42 => println!("Correct!"), 
        x => println!("{} is the wrong answer", x) 
    } 
    

    "正解!" f()が42を返した場合は印刷されます。それ以外の場合は、入力された数値が "間違った答え"で印刷されます。

  • ワイルドカードパターン_。識別子と同様に、これは何にもマッチしますが、識別子とは異なり、何も割り当てられません。あなたが一致した値を必要としない場合(上記の例で入力した番号を印刷したくないだろうと言う、そしてあなただけのX(pattern1, ..., patternN)がAで、列挙型の任意の変形X(arg1, ..., argN)について_ => println!("Wrong")

  • を書くことができ、これを使用します引数なしで有効なパターン及び任意の変異体Yため、Yが有効なパターンである変異体Yと一致Yパターン引数一致パターンpatternN介してpattern1場合、それぞれの変異体Xのインスタンスと一致X(pattern1, ..., patternN)パターン、この例を考えてみてください。。。

    enum Foo { 
        X(i32, i32), 
        Y 
    } 
    
    fn g() -> Foo { ... } 
    
    fn foo() { 
        match g() { 
        X(a,b) -> a+b 
        Y -> 0 
        } 
    } 
    

    g()が返された場合、foo()はXの値の合計を返します。g()Yの場合は0を返します。

+0

便利なリンク:[一致](https://doc.rust-lang.org/book/match.html)と[パターン](https://doc.rust-lang.org/book/patterns.html)in参考文献の本と[一致する式](https://doc.rust-lang.org/reference.html#match-expressions)を参照してください。その他の重要なパターンには、タプル、 "|"で結合されたパターン、範囲、 "@"で囲まれたサブパターンなどがあります。 Enumバリアントは、宣言された方法に応じて 'X'、' X(..) 'または' X {..} 'の構文を持つことができます。 –

関連する問題