Skip to content

Commit e33b1da

Browse files
ezyangadrientetar
authored andcommitted
Elaborate manual on matching (dereference patterns, lvalue/rvalue matching)
Signed-off-by: Edward Z. Yang <ezyang@cs.stanford.edu>
1 parent b2cac49 commit e33b1da

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

doc/rust.md

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2893,12 +2893,21 @@ tail value of `~Nil`. The second pattern matches _any_ list constructed with `Co
28932893
ignoring the values of its arguments. The difference between `_` and `*` is that the pattern `C(_)` is only type-correct if
28942894
`C` has exactly one argument, while the pattern `C(..)` is type-correct for any enum variant `C`, regardless of how many arguments `C` has.
28952895

2896-
To execute an `match` expression, first the head expression is evaluated, then
2897-
its value is sequentially compared to the patterns in the arms until a match
2896+
A `match` behaves differently depending on whether or not the head expression
2897+
is an [lvalue or an rvalue](#lvalues-rvalues-and-temporaries).
2898+
If the head expression is an rvalue, it is
2899+
first evaluated into a temporary location, and the resulting value
2900+
is sequentially compared to the patterns in the arms until a match
28982901
is found. The first arm with a matching pattern is chosen as the branch target
28992902
of the `match`, any variables bound by the pattern are assigned to local
29002903
variables in the arm's block, and control enters the block.
29012904

2905+
When the head expression is an lvalue, the match does not allocate a
2906+
temporary location (however, a by-value binding may copy or move from
2907+
the lvalue). When possible, it is preferable to match on lvalues, as the
2908+
lifetime of these matches inherits the lifetime of the lvalue, rather
2909+
than being restricted to the inside of the match.
2910+
29022911
An example of an `match` expression:
29032912

29042913
~~~~
@@ -2932,6 +2941,15 @@ This can be changed to bind to a reference by
29322941
using the ```ref``` keyword,
29332942
or to a mutable reference using ```ref mut```.
29342943

2944+
Patterns can also dereference pointers by using the ``&``,
2945+
``~`` or ``@`` symbols, as appropriate. For example, these two matches
2946+
on ``x: &int`` are equivalent:
2947+
2948+
~~~~
2949+
match *x { 0 => "zero", _ => "some" }
2950+
match x { &0 => "zero", _ => "some" }
2951+
~~~~
2952+
29352953
A pattern that's just an identifier,
29362954
like `Nil` in the previous answer,
29372955
could either refer to an enum variant that's in scope,

0 commit comments

Comments
 (0)