From 165c11a0e2d4d398abba08cc00b81c4ef500e339 Mon Sep 17 00:00:00 2001 From: David Wood Date: Sun, 30 Sep 2018 22:40:53 +0200 Subject: [PATCH 1/2] Mention syntax ambiguity for eRFC 2947. --- src/expressions/if-expr.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/expressions/if-expr.md b/src/expressions/if-expr.md index 33f1e1622..415737de6 100644 --- a/src/expressions/if-expr.md +++ b/src/expressions/if-expr.md @@ -44,7 +44,7 @@ assert_eq!(y, "Bigger"); > **Syntax**\ > _IfLetExpression_ :\ ->    `if` `let` [_Pattern_] `=` [_Expression_]_except struct expression_ +>    `if` `let` [_Pattern_] `=` [_Expression_]_except struct or lazy boolean operator expression_ > [_BlockExpression_]\ >    (`else` ( > [_BlockExpression_] @@ -111,6 +111,12 @@ match EXPR { } ``` +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_]). + [_Expression_]: expressions.html [_BlockExpression_]: expressions/block-expr.html [_Pattern_]: patterns.html +[_LazyBooleanOperatorExpression_]: expressions/operator-expr.html#lazy-boolean-operators +[_eRFCIfLetChain_]: https://github.com/rust-lang/rfcs/blob/master/text/2497-if-let-chains.md#rollout-plan-and-transitioning-to-rust-2018 From 9f758ac04ae2ebedb47b66f25127259080133914 Mon Sep 17 00:00:00 2001 From: David Wood Date: Sun, 30 Sep 2018 23:18:33 +0200 Subject: [PATCH 2/2] Mention a solution for eRFC 2947 ambiguity. --- src/expressions/if-expr.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/expressions/if-expr.md b/src/expressions/if-expr.md index 415737de6..0395d7b00 100644 --- a/src/expressions/if-expr.md +++ b/src/expressions/if-expr.md @@ -114,6 +114,22 @@ match EXPR { 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_]). +When lazy boolean operator expression is desired, this can be achieved +by using parenthesis as below: + +```rust,ignore +// Before... +if let PAT = EXPR && EXPR { .. } + +// After... +if let PAT = ( EXPR && EXPR ) { .. } + +// Before... +if let PAT = EXPR || EXPR { .. } + +// After... +if let PAT = ( EXPR || EXPR ) { .. } +``` [_Expression_]: expressions.html [_BlockExpression_]: expressions/block-expr.html