Rust中的分号是否可选?

问题描述 投票:24回答:1

由于分号在Rust中显然是可选的,为什么,如果我这样做:

fn fn1() -> i32 {    
    let a = 1
    let b = 2
    3
}

我收到错误:

error: expected one of `.`, `;`, `?`, or an operator, found `let`
 --> src/main.rs:3:9
  |
2 |         let a = 1
  |                  - expected one of `.`, `;`, `?`, or an operator here
3 |         let b = 2
  |         ^^^ unexpected token
syntax rust
1个回答
65
投票

它们不是可选的。分号修改表达式语句的行为,因此无论是否使用它们代码行,都应该有意识地做出决定。

Rust中的几乎所有内容都是表达式。表达式是返回值的东西。如果你输了一个分号,你就会抑制这个表达式的结果,这在大多数情况下都是你想要的。

另一方面,这意味着如果使用不带分号的表达式结束函数,将返回最后一个表达式的结果。同样可以应用于match语句中的块。

您可以在没有分号的情况下使用表达式的表达式。

例如:

let a = {
    let inner = 2;
    inner * inner
};

这里表达式inner * inner不以分号结尾,因此其值不会被抑制。由于它是块中的最后一个表达式,因此将返回其值并将其分配给a。如果在同一行上放置分号,则不会返回inner * inner的值。

在您的特定情况下,不抑制let语句的值是没有意义的,编译器正确地给你一个错误。事实上,let不是表达。

© www.soinside.com 2019 - 2024. All rights reserved.