2014-10-30 178 views
10

由于分号显然是可选的拉斯特,为什么,如果我这样做:分号在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 

回答

39

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

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

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

你可以在任何其他地方使用没有分号的表达式。

例如:

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

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

在你的具体情况下,不要压制你的let语句的值没有意义,编译器会正确地给你一个错误。实际上,let不是一个表达式。

+0

您也可以查看https://rustbyexample.com/expression.html关于也提到分号的表达式。 – nbro 2018-02-11 21:52:14

相关问题