为什么在结束“循环”时“中断”不需要分号?
摘自Rust 书的第 3.5 章:
我们使用
break带有 value的关键字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; // ()
}
};
这只是分号不会干扰预期结果的另一个例子。一方面,分号的插入引入了一个表达式语句,其计算结果为单元类型()。由于loops 和if表达式继续接受计算为相同类型的代码块(),因此所有类型都符合要求。
let _: i32 = loop {
if true {
break 3 // !
}
};
如果去掉分号,则将break评估为never 类型!,这会强制转换为任何其他类型。这意味着它将满足外部作用域所期望的任何类型。所以一切都一样,只要您不尝试在 if 块的末尾之前附加任何其他语句。
无论break和return评估,以!作为其副作用意味着该程序将无法与自然的工作流程办理。
也可以看看:
- 为什么 return 表达式在不需要时使用分号?
- 在 Rust 中使用 return 语句和省略分号有什么区别?
- 如何静态断言函数的结尾无法访问