【Rust】 2. 数据类型笔记

一、类型系统概述

Rust 是静态类型语言,所有变量类型在编译时就必须确定。

静态类型 vs 动态类型
特性 静态类型语言 动态类型语言
类型检查时机 编译时期 运行时期
性能 更好(无运行时类型检查开销) 较差(需要运行时类型检查)
类型声明 需要显式声明 不需要显式声明
例子 Java, C++, Rust Python, JavaScript

二、数据类型分类

  1. 标量类型(Scalar)

单个值类型

1.1 整型(Integer)

  • 有符号:i8, i16, i32, i64, i128, isize

  • 无符号:u8, u16, u32, u64, u128, usize

  • 默认类型:i32

字面量表示:

rust 复制代码
let decimal = 98_222;    // 十进制
let hex = 0xff;          // 十六进制
let octal = 0o77;        // 八进制
let binary = 0b1111_0000;// 二进制
let byte = b'A';         // 字节(u8)

整数溢出处理:

  • debug模式:panic

  • release模式:自动舍弃高位

  • 可用方法显式处理:wrapping_, checked_, overflowing_, saturating_

1.2 浮点型(Float)

  • f32:32位单精度

  • f64:64位双精度(默认类型)

注意: 浮点数是近似值,避免直接相等性比较

1.3 布尔型(Boolean)

  • 值:true/false

  • 大小:1字节

  • 用于逻辑运算和条件判断

1.4 字符型(Character)

  • 类型:char

  • 大小:4字节(Unicode标量值)

  • 单字节字符:使用u8类型和b前缀

1.5 序列(Range)

rust 复制代码
1..5    // 1到4(不包含5)
1..=5   // 1到5(包含5)
  1. 复合类型(Compound)

组合多个值为一个类型

2.1 元组(Tuple)

  • 固定长度

  • 可包含不同类型

  • 访问方式:模式匹配解构 或 数字索引

rust 复制代码
let tup = (500, 6.4, 1);
let (x, y, z) = tup;  // 解构
let five_hundred = tup.0;  // 索引访问

2.2 数组(Array)

  • 固定长度
  • 元素类型必须相同
  • 访问方式:下标索引 或 get()方法
rust 复制代码
let a = [1, 2, 3, 4];
let first = a[0];           // 索引访问
let first = a.get(0);       // 返回Option类型

2.3 结构体(Struct)

三种形式:

  • 具名结构体:struct Point { x: i32, y: i32 }

  • 元组结构体:struct Color(i32, i32, i32);

  • 单元结构体:struct Unit;

  1. 枚举(Enum)

表示"或"关系,可包含不同类型数据

rust 复制代码
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}
  1. 特殊类型
  • Never类型:!,表示不可能返回的值(目前不稳定)

三、类型选择原则

  1. 理解数据特性:值范围、是否需要小数、是否可变等

  2. 选择最小合适类型:节省内存,提高性能

  3. 平衡类型安全与灵活性

  4. 考虑数据可变性需求

  5. 利用复合类型组织复杂数据

  6. 进行充分测试验证

四、常见错误

  1. 类型转换需要显式声明
rust 复制代码
let var1: i8 = 1;
let var2: i32 = var1 as i32;  // 需要as关键字
  1. 复合数据类型不允许直接嵌套
rust 复制代码
// 错误示例
struct Node {
    data: i32,
    next: Node,  // 不允许直接嵌套
}

五、总结

Rust的类型系统设计强调安全性和性能:

  • 静态类型检查在编译期捕获错误

  • 丰富的标量和复合类型满足各种需求

  • 明确的类型转换规则防止隐式错误

  • 内存安全的设计避免常见编程错误

选择合适的数据类型需要综合考虑数据的特性、内存使用、性能需求和代码可维护性等因素。

相关推荐
花褪残红青杏小11 小时前
Rust图像处理第11节-故障风 RGB 通道偏移:错位错色制造电子故障
rust·webassembly·图形学
花褪残红青杏小12 小时前
Rust图像处理第10节-浮雕/雕刻滤镜:邻域差值生成凹凸效果
rust·webassembly·图形学
Rockbean13 小时前
10分钟Solana-性能web3-2.4 Rust 编程基础三:结构体、枚举、错误处理与集合
rust·web3·智能合约
doiito14 小时前
【Agent Harness】Gliding Horse 上下文感知与智能压缩:让 Agent 的“注意力”永不偏移
ai·rust·架构设计·系统设计·ai agent
花褪残红青杏小1 天前
Rust图像处理第9节-Sobel 边缘检测:第一个真正用卷积的算法
rust·webassembly·图形学
doiito2 天前
【Agent Harness】Gliding Horse L2 作战地图深度优化:给多 Agent 上下文装上“精准导航”
ai·rust·架构设计·系统设计·ai agent
花褪残红青杏小2 天前
Rust图像处理第8节-暗角 & 复古胶片特效:四周衰减中心高亮
rust·webassembly·图形学
独孤留白3 天前
从C到Rust:Rust 的 Trait 不是Interface,那是什么?
rust