2016-08-19 55 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 {..}'语法。 –