主题
数据类型
每个值有确定类型。标量是整数、浮点、布尔、字符;复合类型是元组与数组。标准库再提供 String、Vec 等拥有堆内存的类型,规则相同。
标量
| 种类 | 类型 | 说明 |
|---|---|---|
| 整数 | i8…i128、u8…u128、isize / usize | usize 跟随指针宽度,用作索引 |
| 浮点 | f32、f64 | 默认推断为 f64 |
| 布尔 | bool | 只有 true / false,不能当整数用 |
| 字符 | char | Unicode 标量值,固定 4 字节 |
整数字面量可加类型后缀和分隔符:1_000u32、0xff、0b1010。debug 构建中整数溢出 panic,release 默认回绕。需要明确语义时用 checked_* / saturating_*。
as 做原始类型转换,截断或变窄时不会报错,只适合宽度和含义都清楚的场合。
元组
固定长度、元素类型可以不同。可用模式解构,.0、.1 按位置访问。空元组 () 是单元类型,表示「没有有意义的值」,也是默认返回类型。
rust
let pair: (i32, &str) = (1, "one");
let (id, name) = pair;
assert_eq!(pair.0, 1);数组与切片
数组 [T; N] 长度编译期固定,元素同类型,数据在栈上。切片 &[T] / &mut [T] 是对连续元素的借用,长度在运行时才知道。
rust
let xs = [1, 2, 3];
let first = &xs[0];
let rest = &xs[1..];越界索引会 panic。需要运行时变长序列时用 Vec<T>,而不是数组。
文本
| 类型 | 含义 |
|---|---|
&str | 字符串切片,指向 UTF-8,不拥有数据 |
String | 拥有堆上 UTF-8 缓冲区 |
&[u8] / Vec<u8> | 字节;网络和文件 I/O 的底层形态 |
字面量 "demo" 的类型是 &'static str。修改文本需要 String;只读传递用 &str。String 由 to_string()、format!、String::from 得到。
集合
Vec<T> 是连续可增长数组。HashMap<K, V> 要求 K: Eq + Hash。迭代器惰性,消费前不分配新集合:
rust
let names: Vec<_> = users
.iter()
.filter(|u| u.active)
.map(|u| u.name.clone())
.collect();iter() 借出 &T,iter_mut() 借出 &mut T,into_iter() 移出 T。
类型标注
局部绑定可推断;数组、数值字面量有歧义时写在绑定或字面量上:
rust
let guess: u32 = "42".parse().unwrap();
let bytes: [u8; 2] = [0x0d, 0x0a];