Rust是基于表达式的语言
Rust是基于表达式的语言,几乎所有代码都可以看作是表达式。
表达式计算后有返回值,例如3+4
是一个表达式,它返回计算结果7。
与表达式对应的概念是语句,语句没有返回值或者不关心其返回值。例如Rust中变量赋值的代码let a=3;
是语句。
在Rust中,可以在表达式结尾加上分号;
来将表达式转换为【语句】。例如:
fn main(){ 3 + 4; }
编译器发现表达式后有分号结尾时,在编译期间会自动修改代码,它会在分号的后面加上一个小括号()
。单独的小括号是一个特殊的值,表示什么也不做。
所以,以上代码实际上等价于:
fn main(){ 3+4;() }
带有分号表示这是一行Rust代码,Rust会先执行3+4
得到7,然后忽略或丢弃该表达式的返回值7,再然后执行下一行代码,即一个单独的小括号,小括号表示什么也不做,直接跳过。
所以,代码3+4;
从原本的表达式转变成了不关心返回值的【语句】。
除了在表达式尾部加分号的代码是语句之外,还有另外一种情况的代码是语句而非表达式:用于声明或定义的代码都是语句。例如let声明变量、fn定义函数、struct声明结构体等。
Rust很多地方都会结合表达式和语句来做变量赋值。例如,if结构也是一个表达式,所以它有返回值,可以将if的返回值赋值给变量,而它的返回值来自于它的大括号:当大括号最后执行的一条代码不加分号结尾时,该代码的计算结果就是if结构的返回值。
例如:
#![allow(unused)] fn main() { let x = if true { println!("true"); 33 // 分支的最后一条代码计算结果赋值给x,不能分号结尾 } else { println!("false"); 44 // 分支的最后一条代码计算结果赋值给x,不能分号结尾 }; // 这个结尾分号表示let语句的结尾分号 }
上面的else分支不能缺少,不能缺少else的原因留待后面的章节再解释。