C3 通用编程概念
https://doc.rust-lang.org/book/ch03-00-common-programming-concepts.html
本章将介绍一系列 Rust 中基本的编程概念.
变量(Variable)和可变性(Mutability)
Rust 变量默认情况下都是不可变的, 意味着不能改变它的指向(绑定), 也无法改变它指向的值. 这样的不可变性可以非常轻松地解决传统语言的许多特定情况 bug.
在有可变性需求的情况下, 可以将变量定义为 mut
.
常量
和变量相比, 使用 const
定义的常量有如下特点:
- 常量类型必须显式给出
- 常量的声明可以在任意域, 比如在全局作用域下.
- 常量的值必须是在编译时确定的, 或者是在编译时可计算的.(需要和之后提到的静态变量进行区分)
- 常量的命名规则为全大写的下划线分隔.
Rust 特色: 变量覆盖(shadowing)
Rust 提供有在同一作用域多次定义相同变量名的能力.
let x = 1; // i32
let x = "hello world"; // &str
println!("x = {x}"); // "hello world"
数据类型
Rust 中的任何值都有 一个对应数据类型, 用于表示该值存放的内存应解释为什么. 先来看 Rust 中的两种数据类型的子集: 基本类型和组合类型.
基本数据类型(Scalar Types)
包含如下:
- 整型: 包括无符号和有符号型, 并且 Rust 中整型常量的写法也非常友好. 当 Rust 进行类型推断时, 若无明确线索(如
let x = 3;
), 会默认将整型定为i32
. - 浮点型: 包含 32 位(单精度浮点型)和 64 位(双精度浮点型). 因现代 CPU 在 f32/f64 的速度上无明显差异, 故默认浮点数类型推断为
f64
(如let x = 1.1;
). Rust 中所有浮点型都是有符号的. - 布尔型:
true
或false
值对应. - 字符型: 通过单引号给出的值. Rust 的
char
为四字节, 且表示为 Unicode Scalar 值.
组合类型
- 元组(Tuple): 将多个值绑定到同一个变量上, 比如
let tup = (500, 6.4, 1);
, tup 类型为(i32, f64, i32)
.- 可以通过解构将元组重新分解绑定到多个变量, 比如
let (x, y, z) = tup;
, 则 x 为 500, y 为 6.4, z 为 1. - 可以通过
.
和序号(从 0 开始)访问元组的单个值, 比如let x1 = tup.1
, 则 x1 的值为 6.4. - 可以通过
()
定义一个空值元组, 也称为unit
, 用于表示 "空值", 或 "空返回值". 当 Rust 表达式无其他返回值时, 会默认返回一个空值元组()
. 空值元组和其对应的类型均表示为 "()
".
- 可以通过解构将元组重新分解绑定到多个变量, 比如
静态数组
数组集合类型和元组不同之处在于: 其中每个元素都需要是同一类型的, 且 Rust 中的静态数组必须是预先设置长度.
let arr_stack = [1, 2, 3, 4, 5]; // 栈上, 其类型为 [i32, 5];
若希望集合在栈上分配, 或者需要保证固定长度元素个数(运行时数组容量不变, 典型例子是存放 12 个月的英文名), 则首选使用静态数组.
数组可以通过下标访问其元素, 如 arr[3]
表示访问其中第四个元素, 在运行时如果检查到出现下标访问越界, 则会触发运行时错误, 在 Rust 中体现为 panic.