Skip to content

数据类型

每个值有确定类型。标量是整数、浮点、布尔、字符;复合类型是元组与数组。标准库再提供 StringVec 等拥有堆内存的类型,规则相同。

标量

种类类型说明
整数i8i128u8u128isize / usizeusize 跟随指针宽度,用作索引
浮点f32f64默认推断为 f64
布尔bool只有 true / false,不能当整数用
字符charUnicode 标量值,固定 4 字节

整数字面量可加类型后缀和分隔符:1_000u320xff0b1010。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;只读传递用 &strStringto_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() 借出 &Titer_mut() 借出 &mut Tinto_iter() 移出 T

类型标注

局部绑定可推断;数组、数值字面量有歧义时写在绑定或字面量上:

rust
let guess: u32 = "42".parse().unwrap();
let bytes: [u8; 2] = [0x0d, 0x0a];

参考

基于 MIT 许可发布