语句与表达式
这一节,我们接触的是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" }; }