在Java中经常听到类似赋值语句、lambda表达式的说法,却从来没有在意过所谓的语句和表达式有什么区别,而在实际的使用中,它们好像确实没啥区别,但是在Rust中,语句和表达式就被严格区分开来了,《Rust 程序设计语言》中提到Rust 的函数体是由一系列语句和一个可选的结尾表达式来构成。
Rust中语句(Statments)是执行一些操作但不返回值的指令,比如一个创建变量并绑定值的语句:let x = 6;
,而表达式(Expressions)则计算并返回一个值,比如5 + 6
,它计算并返回一个值11。
表达式可以是语句的一部分,例如我们把上面的5 + 6
绑定给一个变量x,let x = 5 + 6;
。一个代码块也是一个表达式,像这样:
let y =
{
let x = 6;
x + 1
}
花括号中的代码返回了x+1的值7,注意x+1的后面没有分号,一旦加上了分号,它就成了一个语句,这段代码块的返回值就被隐式的设置为()
,没有错,在Rust中()
也是一个值。
在ide中的代码提示中可以很清晰的看到,没加分号前 y的类型是i32,加了分号后类型就成了()
。
函数中的结尾表达式也跟上面的代码块中的用法类似,可以充当函数的返回值,如果没有返回值,则会隐性返回一个()
,因为在rust中存在一种永远不返回值的函数,需要用!
来作为返回类型。
显式的将没有返回值的函数的返回值写成()
,也是没有问题的,所以函数的调用也是一个表达式,哪怕有些函数它看上去好像没有返回值。
总结一下:
在Rust中语句不能返回值并以分号结尾,表达式总是返回值并且不能加分号,表达式可以作为函数的返回值,而语句不能。
溜了溜了。。