Syntax 在Rust中分号是可选的吗?

Syntax 在Rust中分号是可选的吗?,syntax,rust,Syntax,Rust,因为分号在Rust中显然是可选的,如果我这样做,为什么: fn fn1() -> i32 { let a = 1 let b = 2 3 } 我得到一个错误: 错误:应为`、`、`、`、`、`、`、`、`,或者一个接线员,找到“let”` -->src/main.rs:3:9 | 2 |设a=1 |-应为`、`、`、`、`、`、`、`、`、`,还是这里的接线员 3 |设b=2 |^^^意外标记 它们不是可选的。分号会修改表达式语句的行为,因此在代码行中是否

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

fn fn1() -> i32 {    
    let a = 1
    let b = 2
    3
}
我得到一个错误:

错误:应为`、`、`、`、`、`、`、`、`,或者一个接线员,找到“let”`
-->src/main.rs:3:9
|
2 |设a=1
|-应为`、`、`、`、`、`、`、`、`、`,还是这里的接线员
3 |设b=2
|^^^意外标记

它们不是可选的。分号会修改表达式语句的行为,因此在代码行中是否使用分号应该是一个有意识的决定

几乎所有锈迹斑斑的东西都是一种表情。表达式是返回值的东西。如果使用分号,则会抑制此表达式的结果,在大多数情况下,这是您想要的结果

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

您可以在其他需要值的地方使用不带分号的表达式

例如:

let a = {
    let inner = 2;
    inner * inner
};
此处表达式
internal*internal
没有以分号结尾,因此其值不会被抑制。由于它是块中的最后一个表达式,它的值将被返回并分配给
a
。如果将分号放在同一行上,则不会返回
internal*internal
的值


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

分号通常不是可选的,但也有一些情况是可选的。即在控制表达式之后,如
for
if/else
match

fn main(){
设a:u32=5;
如果5==a{
println!(“你好!”);
}
如果5==a{
println!(“你好!”);
};
在“World.chars()中的x{
println!(“{}”,x);
}
在“World.chars()中的x{
println!(“{}”,x);
};
}

(在某些情况下,这些语句需要或不需要分号。如果从内部返回值,则不能使用分号,如果将变量设置为从内部返回的值,则需要使用分号。)

您还可以检查同样提到分号的表达式。