为什么在结束“循环”时“中断”不需要分号?

摘自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 块的末尾之前附加任何其他语句。

无论breakreturn评估,以!作为其副作用意味着该程序将无法与自然的工作流程办理。

也可以看看:

  • 为什么 return 表达式在不需要时使用分号?
  • 在 Rust 中使用 return 语句和省略分号有什么区别?
  • 如何静态断言函数的结尾无法访问

以上是为什么在结束“循环”时“中断”不需要分号?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>