← [ BACK_TO_NOTES ]

Rust 基本类型

Rust 的标量类型(整型、浮点、布尔、字符)与复合类型(元组、数组)的表示、字面量与常见边界。

#concept #growing #dev #rust

[!info] related notes

Rust 基本类型

这个概念为什么出现

在谈所有权之前,必须先能稳定地描述数据:

  • 整数到底多少位、有没有符号?
  • 浮点比较为什么危险?
  • char 为什么不是 C 的单字节?
  • 元组与数组分别解决什么聚合问题?

基本类型是编译器推断、字面量与 ABI 观感的地基。

[!abstract] 一句话理解 Rust 标量类型有明确表示,其中 usize/isize 宽度取决于目标平台;元组聚合异构固定字段,数组聚合同构固定长度;更灵活的堆结构(String/Vec)建立在这些基础与所有权之上。

最小可运行示例

场景:库存服务描述一件 SKU 的“静态规格卡”

商品中台要为 SKU 打印一张规格卡:价格分、是否上架、等级标签字符、尺寸三元组、近 7 日销量数组。
这些字段都适合基本类型,还不需要 Vec。

// 业务意图:用标量与复合类型描述 SKU 规格并格式化输出。
// 教学点:整型宽度、bool、char、tuple、array 的字面量与访问。

fn main() {
    // 价格用分表示,避免过早用 f64 做货币
    let price_cents: u32 = 1_990;

    // 是否可售
    let on_shelf: bool = true;

    // char 是 Unicode 标量值,占 4 字节宽度语义,不是单字节
    let grade: char = 'A';

    // 元组:长宽高(cm),异构亦可,这里同为 u16
    let dims_cm: (u16, u16, u16) = (30, 20, 12);
    let (l, w, h) = dims_cm; // 解构

    // 数组:近 7 日销量,长度属于类型
    let sales_last_7d: [u32; 7] = [3, 5, 2, 8, 1, 0, 4];
    let day0 = sales_last_7d[0];

    println!(
        "price={} on_shelf={} grade={} dims={}x{}x{} day0_sales={}",
        price_cents, on_shelf, grade, l, w, h, day0
    );
}

建议运行:

cargo run

期望输出:

price=1990 on_shelf=true grade=A dims=30x20x12 day0_sales=3

结合场景再看三个关注点

  1. 货币优先整数分:基本类型选择会影响业务正确性。
  2. 数组长度在类型里:[u32; 7] 与 [u32; 30] 是不同类型。
  3. 元组解构让“规格卡字段”读取清晰。

核心概念与准确模型

标量类型

类别类型要点
有符号整数i8…i128、isize可负;isize 随指针宽度
无符号整数u8…u128、usize索引常用 usize
浮点f32、f64(默认推断常偏 f64)二进制浮点,相等比较需谨慎
布尔booltrue/false
字符charUnicode 标量值,字面量用单引号

整型字面量可用下划线:1_000_000。可用后缀:42u8。

复合类型

元组 (T, U, …)

  • 固定长度、字段类型可不同
  • 用 .0、.1 或解构访问
  • 空元组 () 是 unit 类型,常作“无额外信息”的返回

数组 [T; N]

  • 固定长度、元素同类型
  • 元素连续存储;数组本身不决定栈/堆位置,可作为局部值、静态值或位于 Box/其他容器中
  • 安全索引越界会 panic,release 也不允许越界读取;编译器能证明越界时还可能直接拒绝编译,需非 panic 分支时用 .get()

类型注解与推断

let x = 5;        // 默认整型推断为 i32(在典型上下文中)
let y: u8 = 5;
let z = 5.0;      // 典型默认 f64

上下文不足时编译器会要求注解。

设计动机

  • 宽度显式:避免“平台 int 是多少”的隐式坑(isize/usize 是有意的指针宽类型)
  • 安全默认:普通整数运算默认 dev 开启溢出检查、release 关闭并回绕,但可由 profile 的 overflow-checks 改变;常量求值溢出可编译失败。需要稳定业务语义时用 checked_* / saturating_* / wrapping_*
  • 复合类型轻量:小聚合不必立刻上 struct(struct 见后续)

边界情况与反直觉行为

  • char 不是 UTF-8 字节或完整显示字符:char 大小为 4 字节,UTF-8 编码占 1–4 字节;一个可见字符也可能由多个 Unicode 标量组成。字符串索引应按字节/字符边界小心处理,见 字符串。
  • 浮点:0.1 + 0.2 == 0.3 可能为 false。
  • 数组不等于切片:[T; N] 拥有数据;&[T] 是借用视图。
  • 整数溢出:业务代码对金额/计数优先 checked_ 或明确包装策略。

常见误区

[!warning] 常见误区:把 char 当 byte 错误理解:char 像 C 的 char 一字节。
正确模型:Unicode 标量值。
为何易错:关键词看起来像 C。

[!warning] 常见误区:用 f64 存钱 错误理解:小数用浮点最自然。
正确模型:货币用整数最小单位或十进制库。
为何易错:十进制字面量直觉。

工程实践

  1. 公共 API 显式写出关键整型宽度。
  2. 索引与长度用 usize。
  3. 超过栈友好大小的数据用 Vec 等堆结构。
  4. 领域概念稳定后升级为 struct,而不是长元组。

本节总结

  • 标量:整数、浮点、bool、char。
  • 元组异构固定,数组同构固定。
  • 类型选择有业务后果(钱、索引、文本)。
  • 动态集合与字符串是下一层笔记。

自测题

概念题

  1. 为什么数组长度是类型的一部分?

代码推理题

  1. (i32, f64, u8) 能否整体赋给类型 (i32, f64) 的变量?
参考答案
  1. 使大小在编译期可知,便于布局与边界检查,并区分不同长度的类型。
  2. 不能,元组类型含长度与各字段类型,必须匹配。

延伸阅读与资料来源

资料类型支撑内容
The Book — Data Types官方书标量与复合类型
std::primitive标准库原始类型文档
创建于 2026/7/15 更新于 2026/10/7
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本