Skip to main content

C3 通用编程概念

https://doc.rust-lang.org/book/ch03-00-common-programming-concepts.html

本章将介绍一系列 Rust 中基本的编程概念.

变量(Variable)和可变性(Mutability)

Rust 变量默认情况下都是不可变的, 意味着不能改变它的指向(绑定), 也无法改变它指向的值. 这样的不可变性可以非常轻松地解决传统语言的许多特定情况 bug.

在有可变性需求的情况下, 可以将变量定义为 mut.

常量

和变量相比, 使用 const 定义的常量有如下特点:

  1. 常量类型必须显式给出
  2. 常量的声明可以在任意域, 比如在全局作用域下.
  3. 常量的值必须是在编译时确定的, 或者是在编译时可计算的.(需要和之后提到的静态变量进行区分)
  4. 常量的命名规则为全大写的下划线分隔.

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 中所有浮点型都是有符号的.
  • 布尔型: truefalse 值对应.
  • 字符型: 通过单引号给出的值. 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.