当前位置: 首页 > news >正文

【Rust】 2. 数据类型笔记

一、类型系统概述

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

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

二、数据类型分类

  1. 标量类型(Scalar)

单个值类型
1.1 整型(Integer)

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

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

  • 默认类型:i32

字面量表示:


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)


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

组合多个值为一个类型
2.1 元组(Tuple)

  • 固定长度

  • 可包含不同类型

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


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

2.2 数组(Array)

  • 固定长度
  • 元素类型必须相同
  • 访问方式:下标索引 或 get()方法

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)

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


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

三、类型选择原则

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

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

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

  4. 考虑数据可变性需求

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

  6. 进行充分测试验证

四、常见错误

  1. 类型转换需要显式声明

let var1: i8 = 1;
let var2: i32 = var1 as i32;  // 需要as关键字
  1. 复合数据类型不允许直接嵌套

// 错误示例
struct Node {data: i32,next: Node,  // 不允许直接嵌套
}

五、总结

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

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

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

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

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

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

http://www.dtcms.com/a/353081.html

相关文章:

  • Compose副作用域
  • 大模型重构建筑“能耗基因“:企业如何用物联中台打响能源革命?
  • 入行IC | 数字IC设计和FPGA哪个好?
  • STM32 入门实录:从 0 到 3 色 LED 呼吸式闪烁
  • Git-远程操作
  • 基于 Node.js 的淘宝 API 接口开发:快速构建异步数据采集服务
  • SFTP服务器可以通过同一个登录到SFTP服务器的账号密码连接上控制台吗
  • 【0420】Postgres内核 实现(借助 SMgrRelation)为指定 table(CREATE TABLE)创建 disk file
  • android证书相关
  • 天启录:Linux性能调优·混沌掌控者篇
  • Android中AAR、JAR文件
  • 具身导航助力果园种植!基于模仿学习的果园环境无人机视觉导航
  • Spring Boot项目集成日志系统使用完整指南
  • R-Zero:通过自博弈机制让大语言模型无需外部数据实现自我进化训练
  • Flutter桌面应用实战:Windows系统代理切换工具开发
  • 集成电路学习:什么是SSD单发多框检测器
  • 线性回归原理推导与应用(十一):多重共线性
  • 20250827的学习笔记
  • Kubernetes(k8s) 常用命令
  • 从零开始学习JavaWeb-19
  • 解决跨运营商限速:在飞牛OS系统上启用BBR算法优化网络速度
  • 数据结构:单链表的应用(力扣算法题)第一章
  • 腾讯云人脸识别API技术深度解析:从算法原理到工程实践
  • Diagnosing bias and variance|诊断偏差和方差
  • 文件系统中的核心数据结构
  • 链表-25.k个一组翻转链表-力扣(LeetCode)
  • 镜中万象:论观察即存在的递归拓扑与生命的意识本质
  • FPGA的工作原理
  • AI赋能CRM:纷享销客访销大脑重构快消品销售策略
  • d435i相机读取镜头内参和相对之间的外参