Rust - 这里需要分号吗?

Akb*_*ein 2 rust

此代码的目的是从 1 到 4 循环并停止。我的问题是为什么如果我在 else 语句 (;) 中添加或保留分号并不重要……代码编译得很好。最好的方法是什么?添加分号还是保留它?

fn main() {
    let mut var = 1;
    loop{
        println!("It is now {}", var);
        if var >= 4 {
            println!("Finished the loop");
            break;
            
        } else {
            var = var + 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 6

通常,尾随分号确定块的返回值。如果省略分号,则返回值是块中最后一个表达式的值。包含分号后,返回值始终是 Rust 的单元值,即空元组()(除非块包含不返回的表达式,在这种情况下,返回类型是“never”类型!,它没有任何值) .

在这种特殊情况下,没有语义差异。赋值表达式也返回单位值,即(var = var + 1) == ()。然而,这或多或少是巧合。您实际上不想在该语句中返回任何值,因此包含分号会使您的意图更加清晰。

  • 好吧,我几乎在此之前发布了相同的答案,让我通过[参考链接](https://doc.rust-lang.org/reference/expressions/operator-expr.html#assignment-expressions)来支持这一点,它指出:_“赋值表达式总是产生单位值。”_ (2认同)