-
Notifications
You must be signed in to change notification settings - Fork 498
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
Add let_chains
references
#1179
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,22 +1,31 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# `if` and `if let` expressions | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# `if` expressions | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
## `if` expressions | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
## Syntax | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> **<sup>Syntax</sup>**\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> _IfExpression_ :\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> `if` [_Expression_]<sub>_except struct expression_</sub> [_BlockExpression_]\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> (`else` ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> [_BlockExpression_] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | _IfExpression_ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | _IfLetExpression_ ) )<sup>\?</sup> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> `if` _IfConditions_ [_BlockExpression_]\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> (`else` ( [_BlockExpression_] | _IfExpression_ ) )<sup>\?</sup> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> _IfConditions_ :\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> _IfCondition_ ( && _IfCondition_ )* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> _IfCondition_ :\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> [_Expression_]<sub>_except struct expression_</sub>\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | `let` [_Pattern_] `=` [_Scrutinee_] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
An `if` expression is a conditional branch in program control. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The syntax of an `if` expression is a condition operand, followed by a consequent block, any number of `else if` conditions and blocks, and an optional trailing `else` block. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The condition operands must have the [boolean type]. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
If a condition operand evaluates to `true`, the consequent block is executed and any subsequent `else if` or `else` block is skipped. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
If a condition operand evaluates to `false`, the consequent block is skipped and any subsequent `else if` condition is evaluated. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The syntax of an `if` expression is a sequence of one or more condition operands separated by `&&`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
followed by a consequent block, any number of `else if` conditions and blocks, and an optional trailing `else` block. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Condition operands must be either an [_Expression_] with a [boolean type] or a conditional `let` match. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
If all of the condition operands evaluate to `true` and all of the `let` patterns successfully match their [scrutinee]s, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
the consequent block is executed and any subsequent `else if` or `else` block is skipped. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
If any condition operand evaluates to `false` or any `let` pattern does not match its scrutinee, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
the consequent block is skipped and any subsequent `else if` condition is evaluated. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
If all `if` and `else if` conditions evaluate to `false` then any `else` block is executed. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
An if expression evaluates to the same value as the executed block, or `()` if no block is evaluated. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
An `if` expression evaluates to the same value as the executed block, or `()` if no block is evaluated. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
An `if` expression must have the same type in all situations. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -29,6 +38,7 @@ if x == 4 { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
println!("x is something else"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// `if` can be used as an expression. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let y = if 12 * 15 > 150 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"Bigger" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -37,34 +47,23 @@ let y = if 12 * 15 > 150 { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assert_eq!(y, "Bigger"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
## `if let` expressions | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
## `if let` patterns | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> **<sup>Syntax</sup>**\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> _IfLetExpression_ :\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> `if` `let` [_Pattern_] `=` [_Scrutinee_]<sub>_except lazy boolean operator expression_</sub> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> [_BlockExpression_]\ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> (`else` ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> [_BlockExpression_] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | _IfExpression_ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | _IfLetExpression_ ) )<sup>\?</sup> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
An `if let` expression is semantically similar to an `if` expression but in place of a condition operand it expects the keyword `let` followed by a pattern, an `=` and a [scrutinee] operand. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
If the value of the scrutinee matches the pattern, the corresponding block will execute. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Otherwise, flow proceeds to the following `else` block if it exists. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Like `if` expressions, `if let` expressions have a value determined by the block that is evaluated. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`let` patterns in an `if` condition allow binding new variables into scope when the pattern matches successfully. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The following examples illustrate bindings using `let` patterns: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let dish = ("Ham", "Eggs"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// this body will be skipped because the pattern is refuted | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// This body will be skipped because the pattern is refuted. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let ("Bacon", b) = dish { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
println!("Bacon is served with {}", b); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// This block is evaluated instead. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
println!("No bacon will be served"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// this body will execute | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// This body will execute. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let ("Ham", b) = dish { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
println!("Ham is served with {}", b); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -74,44 +73,8 @@ if let _ = 5 { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`if` and `if let` expressions can be intermixed: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let x = Some(3); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let a = if let Some(1) = x { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else if x == Some(2) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else if let Some(y) = x { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assert_eq!(a, 3); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
An `if let` expression is equivalent to a [`match` expression] as follows: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<!-- ignore: expansion example --> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust,ignore | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let PATS = EXPR { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/* body */ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/*else */ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
is equivalent to | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<!-- ignore: expansion example --> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust,ignore | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
match EXPR { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PATS => { /* body */ }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_ => { /* else */ }, // () if there is no else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Multiple patterns may be specified with the `|` operator. This has the same semantics as with `|` in `match` expressions: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Multiple patterns may be specified with the `|` operator. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
This has the same semantics as with `|` in [`match` expressions]: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
enum E { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -125,31 +88,62 @@ if let E::X(n) | E::Y(n) = v { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The expression cannot be a [lazy boolean operator expression][_LazyBooleanOperatorExpression_]. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Use of a lazy boolean operator is ambiguous with a planned feature change of the language (the implementation of if-let chains - see [eRFC 2947][_eRFCIfLetChain_]). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could this also retain the old note about how to deal with use of lazy boolean expressions when combined with
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done without invalid snippets |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
When lazy boolean operator expression is desired, this can be achieved by using parenthesis as below: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
## Chains of conditions | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Multiple condition operands can be separated with `&&`. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Similar to a `&&` [_LazyBooleanOperatorExpression_], each operand is evaluated from left-to-right until an operand evaluates as `false` or a `let` match fails, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
in which case the subsequent operands are not evaluated. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The bindings of each pattern are put into scope to be available for the next condition operand and the consequent block. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The following is an example of chaining multiple expressions, mixing `let` bindings and boolean expressions, and with expressions able to reference pattern bindings from previous expressions: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fn single() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let outer_opt = Some(Some(1i32)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let Some(inner_opt) = outer_opt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
&& let Some(number) = inner_opt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
&& number == 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
println!("Peek a boo"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+101
to
+111
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This example isn't super clear to me. Can it perhaps be broken up in two and explain what it is illustrating? Maybe something like this:
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<!-- ignore: psuedo code --> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust,ignore | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Before... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let PAT = EXPR && EXPR { .. } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The above is equivalent to the following without using chains of conditions: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// After... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let PAT = ( EXPR && EXPR ) { .. } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fn nested() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let outer_opt = Some(Some(1i32)); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let Some(inner_opt) = outer_opt { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let Some(number) = inner_opt { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if number == 1 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
println!("Peek a boo"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Before... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let PAT = EXPR || EXPR { .. } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
If any condition operand is a `let` pattern, then none of the condition operands can be a `||` [lazy boolean operator expression][_LazyBooleanOperatorExpression_] due to ambiguity and precedence with the `let` scrutinee. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
If a `||` expression is needed, then parentheses can be used. For example: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// After... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let PAT = ( EXPR || EXPR ) { .. } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
```rust | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# let foo = Some(123); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# let condition1 = true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# let condition2 = false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Parentheses are required here. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if let Some(x) = foo && (condition1 || condition2) { /*...*/ } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[_BlockExpression_]: block-expr.md | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[_Expression_]: ../expressions.md | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[_LazyBooleanOperatorExpression_]: operator-expr.md#lazy-boolean-operators | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[_Pattern_]: ../patterns.md | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[_Scrutinee_]: match-expr.md | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[_eRFCIfLetChain_]: https://github.com/rust-lang/rfcs/blob/master/text/2497-if-let-chains.md#rollout-plan-and-transitioning-to-rust-2018 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[`match` expression]: match-expr.md | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[`match` expressions]: match-expr.md | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[boolean type]: ../types/boolean.md | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[scrutinee]: ../glossary.md#scrutinee |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It hasn't been the case for quite some time-> rust-lang/rust#80357
Besides, it is strange to document an inner implementation detail
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think this is necessarily there as an implementation detail, but as a way to specify how it logically desugars. Then, one can refer to the
match
documentation to know how things work wrt scoping and temporaries and such. Otherwise, there might need to be some duplication of the documentation.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My mistake, code desugaring only changed for
while
expressions.for
expressions stay the same