Revise @ in patterns section

Fixes #25008
This commit is contained in:
Steve Klabnik 2015-05-02 10:52:48 -04:00
parent 354d16bd72
commit df18642b1a
1 changed files with 31 additions and 3 deletions

View File

@ -70,8 +70,7 @@ This prints `something else`
# Bindings
If youre matching multiple things, via a `|` or a `...`, you can bind
the value to a name with `@`:
You can bind values to names with `@`:
```rust
let x = 1;
@ -82,7 +81,36 @@ match x {
}
```
This prints `got a range element 1`.
This prints `got a range element 1`. This is useful when you want to
do a complicated match of part of a data structure:
```rust
#[derive(Debug)]
struct Person {
name: Option<String>,
}
let name = "Steve".to_string();
let mut x: Option<Person> = Some(Person { name: Some(name) });
match x {
Some(Person { name: ref a @ Some(_), .. }) => println!("{:?}", a),
_ => {}
}
```
This prints `Some("Steve")`: Weve bound the inner `name` to `a`.
If you use `@` with `|`, you need to make sure the name is bound in each part
of the pattern:
```rust
let x = 5;
match x {
e @ 1 ... 5 | e @ 8 ... 10 => println!("got a range element {}", e),
_ => println!("anything"),
}
```
# Ignoring variants