摘自第3.5章 https://doc.rust-lang.org/book/ch03-05-control-flow.html#returning-values-from-loops《生锈之书》的内容:
我们使用break
带有值的关键字counter * 2
。循环之后,我们使用分号来结束将值赋值给的语句result
.
加上代码片段:
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {}", result);
}
我理解这是如何工作的以及为什么结果是 20,但我注意到如果我删除包含以下内容的行上的分号break
关键字,程序是等价的。
为什么在这种情况下分号是可选的?
一个更短的例子:
let _: i32 = loop {
if true {
break 3; // ()
}
};
这只是分号不会干扰预期结果的另一个例子。首先,插入分号引入了表达式语句 https://doc.rust-lang.org/stable/reference/statements.html#expression-statements,其计算结果为单位类型()
。作为loop
s and if
表达式继续接受计算为相同类型的代码块()
,那么所有类型都符合。
let _: i32 = loop {
if true {
break 3 // ! coerced to ()
}
};
如果去掉分号,则break
被评估为从不类型! https://doc.rust-lang.org/stable/std/primitive.never.html,强制转换为任何其他类型。这意味着它将满足外部作用域所期望的任何类型。在这种情况下,break 3
独自也成为()
来满足 if 表达式。因此,只要您不尝试在 if 块末尾之前附加任何其他语句,一切都一样。
Both break
and return
评估为!
,因为它们的副作用意味着程序将无法按照自然的工作流程进行。
也可以看看:
- 为什么返回表达式在不必要时使用分号? https://stackoverflow.com/questions/27876561/why-do-return-expressions-use-semicolons-when-theyre-unnecessary
- Rust 中使用 return 语句和省略分号有什么区别? https://stackoverflow.com/questions/59013389/whats-the-difference-between-using-the-return-statement-and-omitting-the-semico
- 如何静态断言函数末尾无法到达 https://stackoverflow.com/q/62405398
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)