语句与表达式
这一节,我们接触的是rust中的有一个基本类型 我将其称之为 —— 逻辑结构,这个是我自己命名的,但我觉得很贴切。
我们只需要记住一个有;
结尾的逻辑结构就是语句。 没有的就是表达式。
而我所谓的逻辑结构就是 他包含了变量,操作,可能还要获取结果。的几部分就是逻辑结构。
举例:
fn main() {
let a = 8;
let b: Vec<f64> = Vec::new();
let (a, c) = ("hi", false);
}
以上都是语句, 即 他们都完成了一个具体的操作, 并且没有返回值
而以下内容 则是 表达式:
fn main() {
let y = {
let x = 3; //语句
x + 1 // 表达式
}; // 语句
println!("The value of y is: {}", y);
let z = (let r = 0); // 外层 是语句, 但是右值 是 赋值语句, 因此外层找不到返回值,会报错。
}
总结一下
- 表达式是要有返回值的,没有分号的。
- 表达式添加了分号就变成了语句
let
作为赋值语句,可以直接理解为语句。rust
中是可以通过表达式定义let
声明的左值的,因为实质上这是一个变量绑定,你可以理解为指向函数的指针,但是这个地方会在编译时,将对应函数内容计算出来给左值,(有点像编译时lambda是吧,虽然lambda是运行时的还可以捕获局部参数。但这种写作风格雀氏形似)。- 表达式如果没有显示的返回内容如 :
let z = {let r = 1;r+=1;r}
或者let z = {let r = 1;r+=1;return r}
而是let z = {let r = 1}
那么这是z 实际 赋值单元类型。- 即:表达式如果不返回任何值,会隐式地返回一个
()
。
来段更难的代码:
- 即:表达式如果不返回任何值,会隐式地返回一个
fn main() {
assert_eq!(ret_unit_type(), ())
}
fn ret_unit_type() {
let x = 1;
// if 语句块也是一个表达式,因此可以用于赋值,也可以直接返回
// 类似三元运算符,在Rust里我们可以这样写
let y = if x % 2 == 1 {
"odd"
} else {
"even"
};
// 或者写成一行
let z = if x % 2 == 1 { "odd" } else { "even" };
}