Rust 基本类型

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

#type / concept #status / growing #tech / dev #resource / rust

[!info] 关联笔记

Rust 基本类型

这个概念为什么出现

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

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

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

[!abstract] 一句话理解 Rust 标量类型固定宽度且默认安全优先;元组聚合异构固定字段,数组聚合同构固定长度;更灵活的堆结构(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. 元组解构让“规格卡字段”读取清晰。

核心概念与准确模型

标量类型

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

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

复合类型

元组 (T, U, …)

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

数组 [T; N]

  • 固定长度、元素同类型
  • 默认栈上连续存储(大数组需注意栈大小)
  • 越界索引会 panic(调试与运行时检查相关行为以当前实现/模式为准)

类型注解与推断

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

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

设计动机

  • 宽度显式:避免“平台 int 是多少”的隐式坑(isize/usize 是有意的指针宽类型)
  • 安全默认:溢出在 debug 默认 panic,release 默认 twos-complement 包装(仍可用 checked_*/saturating_*
  • 复合类型轻量:小聚合不必立刻上 struct(struct 见后续)

边界情况与反直觉行为

  • char 不是 UTF-8 字节:字符串索引应按字节/字符边界小心处理,见 字符串
  • 浮点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/7/15