2016-08-19 54 views
1

我是一個非常熟悉C和C++語言的程序員,但是我對自然界的功能很少有經驗。我試圖學習Rust並想知道Rust如何定義一個模式,以及與Rust中的match表達式匹配的模式是什麼。什麼是Rust中模式的定義,什麼是模式匹配?

+1

[書](https://doc.rust-lang.org/book/patterns.html)解釋只是 –

+0

這本書是我轉到源,它並沒有爲我計算的。我誤解了這一點,對我的推理並不深入。 – TheRenegade

+0

@TheRenegade你應該爲這本書開一個問題。如果你不理解它並且可以解釋什麼是錯誤的,那麼這本書本身就可以得到改進,每個人都可以獲益**。 – Shepmaster

回答

5

Rust中存在許多類型的圖案。最值得注意的是:

  • 文字,如42。這些匹配給定的值。所以如果你做​​,如果f()返回42,則將輸入42個案例。
  • 標識符,例如x。這匹配任何內容並將匹配的值分配給x。所以在下面的代碼中:

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

    「正確!」將被打印,如果f()返回42,否則輸入的號碼將被打印爲「是錯誤的答案」。

  • 通配符模式_。就像一個標識符,它匹配任何東西,但與標識符不同,沒有分配任何東西使用這個,如果你並不需要匹配的值(說你不會想打印在上面的例子中輸入的號碼,那麼你可以只寫_ => println!("Wrong")

  • 對於enum的任何變體X(arg1, ..., argN)X(pattern1, ..., patternN)是。有效的模式和用於任何變體Y無參數,Y是有效模式Y所述變體相匹配的圖案Y圖案X(pattern1, ..., patternN)所述變體X的一個實例,如果它的參數匹配模式pattern1通過patternN分別考慮這個例子匹配:

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

    如果g()返回X,則foo()將返回X值的總和,否則返回0,如果g()返回Y

+0

有用鏈接:[Match](https://doc.rust-lang.org/book/match.html)和[Patterns](https://doc.rust-lang.org/book/patterns.html)本書和參考文獻[匹配表達式](https://doc.rust-lang.org/reference.html#match-expressions)。其他重要模式包括元組,用「|」連接的模式,範圍和帶有「@」的子模式。根據Enum變體的聲明方式,Enum變體可能​​有'X','X(..)'或'X {..}'語法。 –