15-if 表达式
3 分钟阅读
译文 · 基于 The Rust Reference
原文链接: https://doc.rust-lang.org/reference/expressions/if-expr.html
r[expr.if]
if 表达式
r[expr.if.syntax]
IfExpression ->
`if` Conditions BlockExpressionNoInnerAttributes
(`else` ( BlockExpressionNoInnerAttributes | IfExpression ) )?
Conditions ->
Expression _except [StructExpression]_
| LetChain
LetChain -> LetChainCondition ( `&&` LetChainCondition )*
LetChainCondition ->
Expression _except [ExcludedConditions]_
| OuterAttribute* `let` Pattern `=` Scrutinee _except [ExcludedConditions]_
@root ExcludedConditions ->
StructExpression
| LazyBooleanExpression
| RangeExpr
| RangeFromExpr
| RangeInclusiveExpr
| AssignmentExpression
| CompoundAssignmentExpression
r[expr.if.intro]
if 表达式的语法是:由 && 分隔的一个或多个条件操作数,后跟一个 then 块、任意数量的 else if 条件和块,以及一个可选的结尾 else 块。
r[expr.if.condition]
条件操作数必须是具有布尔类型的[表达式][Expression],或是条件式 let 匹配。
r[expr.if.condition-true]
若所有条件操作数都求值为 true,且所有 let 模式都成功匹配其被检视表达式,则执行 then 块,并跳过任何后续的 else if 或 else 块。
r[expr.if.else-if]
若任一条件操作数求值为 false,或任一 let 模式未能匹配其被检视表达式,则跳过 then 块,并求值任何后续的 else if 条件。
r[expr.if.else]
若所有 if 和 else if 条件都求值为 false,则执行任何 else 块。
r[expr.if.result]
if 表达式求值为所执行块的值;若没有块被求值,则为 ()。
r[expr.if.type]
if 表达式在所有情况下必须具有相同的类型。
| |
r[expr.if.diverging]
若条件表达式发散,或所有分支都发散,则 if 表达式发散。
| |
r[expr.if.let]
if let 模式
r[expr.if.let.intro]
if 条件中的 let 模式允许在模式匹配成功时把新变量绑定到作用域中。
以下示例演示了使用 let 模式的绑定:
| |
r[expr.if.let.or-pattern]
可以用 | 运算符指定多个模式。其语义与 match 表达式中的 | 相同:
| |
r[expr.if.chains]
条件链
r[expr.if.chains.intro]
多个条件操作数可以用 && 分隔。
r[expr.if.chains.order]
与 && [LazyBooleanExpression] 类似,各操作数从左到右求值,直到某个操作数求值为 false 或某个 let 匹配失败,此后的操作数不再求值。
r[expr.if.chains.bindings] 每个模式的绑定都会进入作用域,供下一个条件操作数和 then 块使用。
以下示例演示了串联多个表达式、混合 let 绑定与布尔表达式,并且后续表达式可以引用先前表达式中的模式绑定:
| |
以上写法等价于下面不使用条件链的形式:
| |
r[expr.if.chains.or]
若任一条件操作数是 let 模式,则任何条件操作数都不能是 || [惰性布尔运算符表达式][expr.bool-logic],以免与 let 被检视表达式产生歧义和优先级问题。
若需要 || 表达式,可以使用圆括号。例如:
| |
r[expr.if.edition2024]
[!EDITION-2024] 在 2024 edition 之前不支持 let 链。也就是说,
if表达式中不允许使用 [LetChain] 语法。