Skip to content

Documenting binding syntax for pattern matching #10917

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion doc/tutorial.md
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ can be expressed with two dots, as in `M..N`. The underscore (`_`) is
a wildcard pattern that matches any single value. (`..`) is a different
wildcard that can match one or more fields in an `enum` variant.

The patterns in a match arm are followed by a fat arrow, `=>`, then an
The patterns in a `match` arm are followed by a fat arrow, `=>`, then an
expression to evaluate. Each case is separated by commas. It's often
convenient to use a block expression for each case, in which case the
commas are optional.
Expand Down Expand Up @@ -542,6 +542,29 @@ Let bindings only work with _irrefutable_ patterns: that is, patterns
that can never fail to match. This excludes `let` from matching
literals and most `enum` variants.

The pattern of a `match` arm can also be bound to a variable for use in the
`match` arm's expression.

~~~~
match (1, 2) {
c@(a, b) => println!("{:?} {:?} {:?}", a, b, c)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you write this as c @ (a, b) (just stylistic; and do it below too). Also, writing the a and b prints as {} rather than {:?} would be nicer.

}
~~~~

This will print `1 2 (1, 2)`. `c` is bound to the pattern `(a, b)`, and as
`a` and `b` are respectively bound to `1` and `2`, `c` comes out to `(1, 2)`.
The bound variable `c` is only usable in the expression following the arrow `=>`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"The bound variable c is only usable in the corresponding arm." (Although I'm not sure this sentence is necessary, since this behaviour is the default. No harm in having it.)


Pattern binding can also be used in conjuntion with guard clauses.

~~~~
match (1, 2) {
c@(a, b) if a > 0 => println!("First arm {:?}", c),
c@(_, b) if b < 2 => println!("Second arm {:?}", c),
_ => {}
}
~~~~

## Loops

`while` denotes a loop that iterates as long as its given condition
Expand Down