【Rust编程语言】Rust数据类型全面解析

Rust数据类型全面解析

      • [**一、标量类型(Scalar Types)**](#一、标量类型(Scalar Types))
        • [1. **整数类型(Integer Types)**](#1. 整数类型(Integer Types))
        • [2. **浮点数类型(Floating-Point Types)**](#2. 浮点数类型(Floating-Point Types))
        • [3. **布尔类型(Boolean Type)**](#3. 布尔类型(Boolean Type))
        • [4. **字符类型(Character Type)**](#4. 字符类型(Character Type))
      • [**二、复合类型(Compound Types)**](#二、复合类型(Compound Types))
        • [1. **元组(Tuple)**](#1. 元组(Tuple))
        • [2. **数组(Array)**](#2. 数组(Array))
        • [3. **结构体(Struct)**](#3. 结构体(Struct))
        • [4. **枚举(Enum)**](#4. 枚举(Enum))
      • [**三、指针类型(Pointer Types)**](#三、指针类型(Pointer Types))
        • [1. **引用(Reference)**](#1. 引用(Reference))
        • [2. **裸指针(Raw Pointer)**](#2. 裸指针(Raw Pointer))
        • [3. **智能指针(Smart Pointers)**](#3. 智能指针(Smart Pointers))
      • [**四、动态大小类型(Dynamically Sized Types, DST)**](#四、动态大小类型(Dynamically Sized Types, DST))
      • [**五、Never 类型(`!`)**](#五、Never 类型(!)
      • **六、其他类型**
      • **总结**
      • **关联文章**

Rust 是一种静态类型语言,其数据类型系统强调 安全性性能 ,同时通过所有权、借用和生命周期机制避免内存错误。Rust 的数据类型可分为 标量类型 (单个值)、 复合类型 (多个值组合)、 指针类型动态大小类型Never 类型 及其他特殊类型。以下是各类数据类型的详细说明:

一、标量类型(Scalar Types)

标量类型表示单个值,包括整数、浮点数、布尔值和字符。

1. 整数类型(Integer Types)

整数是没有小数部分的数字,Rust 提供多种位数和符号的整数类型,以满足不同场景的需求。

类型 有符号/无符号 位数 取值范围 典型用途
i8 有符号 8 位 -128 ~ 127 小范围数值(如像素值)
i16 有符号 16 位 -32768 ~ 32767 中等范围数值
i32 有符号 32 位 -2³¹ ~ 2³¹-1(约 ±21 亿) 默认整数类型(如计数器)
i64 有符号 64 位 -2⁶³ ~ 2⁶³-1(约 ±9EB) 大范围数值(如文件大小)
i128 有符号 128 位 -2¹²⁷ ~ 2¹²⁷-1 超大范围数值(如加密)
isize 有符号 平台相关 32 位系统:±2³¹;64 位系统:±2⁶³ 索引集合(如数组下标)
u8 无符号 8 位 0 ~ 255 字节数据(如图像像素)
u16 无符号 16 位 0 ~ 65535 端口号、Unicode 标量值
u32 无符号 32 位 0 ~ 2³²-1(约 42 亿) IPv4 地址、哈希值
u64 无符号 64 位 0 ~ 2⁶⁴-1(约 184EB) 大文件大小、唯一标识符
u128 无符号 128 位 0 ~ 2¹²⁸-1 加密密钥、高精度计算
usize 无符号 平台相关 32 位系统:0 ~ 2³²-1;64 位系统:0 ~ 2⁶⁴-1 内存地址、集合长度

特性

  • 溢出处理 :Debug 模式下整数溢出会触发 panic;Release 模式下默认"环绕"(wrapping_add 等行为),可通过 overflow-checks 编译选项控制。
  • 字面量表示
    • 十进制:98_222(下划线分隔可读性);
    • 十六进制:0xff
    • 八进制:0o77
    • 二进制:0b1111_0000
    • 字节(仅 u8):b'A'
2. 浮点数类型(Floating-Point Types)

浮点数用于表示带小数部分的数值,遵循 IEEE 754 标准。

类型 位数 精度 取值范围 典型用途
f32 32 位 单精度(6~9 位有效数字) ±1.2×10⁻³⁸ ~ ±3.4×10³⁸ 图形计算(如 GPU 交互)
f64 64 位 双精度(15~17 位有效数字) ±2.3×10⁻³⁰⁸ ~ ±1.7×10³⁰⁸ 默认浮点类型(科学计算)

特性

  • 特殊值 :支持 NaN(非数值,如 0.0/0.0)、infinity(无穷大,如 1.0/0.0)、-infinity(负无穷)。
  • 比较注意NaN != NaN,需用 f32::is_nan() 等方法判断。
3. 布尔类型(Boolean Type)

bool 类型表示逻辑值,仅占 1 字节,取值为 truefalse

特性

  • 用于条件判断(ifwhile)、逻辑运算(&&||!)。
  • 不能直接转换为整数(需显式处理,如 if condition { 1 } else { 0 })。
4. 字符类型(Character Type)

char 类型表示单个 Unicode 标量值(Unicode Scalar Value),占 4 字节(32 位),支持全球几乎所有语言的字符、表情符号(Emoji)和特殊符号。

特性

  • 字面量用单引号 'a''中''😊'(注意:字符串用双引号 " ")。
  • 范围:U+0000 ~ U+D7FFU+E000 ~ U+10FFFF(排除代理区)。
  • 与整数的转换:char 可转换为 u32(如 'a' as u32 结果为 97),反之需 char::from_u32()(可能失败)。

二、复合类型(Compound Types)

复合类型将多个值组合成一个类型,包括元组、数组、结构体和枚举。

1. 元组(Tuple)

元组是固定长度 的异构值集合(元素类型可不同),用圆括号 () 表示。

特性

  • 创建let tup: (i32, f64, u8) = (500, 6.4, 1);
  • 访问元素
    • 解构:let (x, y, z) = tup;(x=500, y=6.4, z=1);
    • 索引:tup.0(500)、tup.1(6.4)(索引从 0 开始)。
  • 空元组() 称为"单元类型"(Unit Type),表示无返回值(如函数默认返回 ()),占 0 字节。
2. 数组(Array)

数组是固定长度 的同构值集合(元素类型相同),用方括号 [] 表示,长度在编译时确定。

声明let arr: [i32; 5] = [1, 2, 3, 4, 5];[类型; 长度]
初始化let zeros = [0; 3];(等价于 [0, 0, 0]

特性

  • 长度固定 :无法动态增删元素(需用 Vec<T> 动态数组)。
  • 内存连续 :元素在栈上连续存储,访问效率高(O(1))。
  • 越界检查 :访问 arr[10] 会触发 panic(Debug 模式)或 UB(Release 模式)。
3. 结构体(Struct)

结构体是自定义复合类型,将多个相关值组合成一个命名实体,类似其他语言的"类"(但无方法,方法需单独定义)。

类型

  • 具名字段结构体(最常见):

    rust 复制代码
    struct User {  
        username: String,  // 字段名: 类型  
        email: String,  
        sign_in_count: u64,  
        active: bool,  
    }  

    创建:let user = User { username: String::from("alice"), email: String::from("alice@example.com"), sign_in_count: 1, active: true };

    访问:user.username

  • 元组结构体(字段无名称,类似元组):

    rust 复制代码
    struct Color(i32, i32, i32);  // 红、绿、蓝分量  
    let red = Color(255, 0, 0);  

    访问:red.0

  • 单元结构体(无字段,类似空元组):

    rust 复制代码
    struct Unit;  // 用于标记类型,或实现 trait 时无数据  
4. 枚举(Enum)

枚举定义一组命名的变体(Variants),每个变体可包含数据(或无数据),用于表示"多选一"的场景。

声明

rust 复制代码
enum Message {  
    Quit,  // 无数据变体  
    Move { x: i32, y: i32 },  // 具名字段变体(类似结构体)  
    Write(String),  // 元组变体(类似元组结构体)  
    ChangeColor(i32, i32, i32),  // 元组变体  
}  

特性

  • 模式匹配 :通过 matchif let 处理不同变体:

    rust 复制代码
    fn process(msg: Message) {  
        match msg {  
            Message::Quit => println!("Quit"),  
            Message::Move { x, y } => println!("Move to ({}, {})", x, y),  
            Message::Write(s) => println!("Write: {}", s),  
            Message::ChangeColor(r, g, b) => println!("Color: {}, {}, {}", r, g, b),  
        }  
    }  
  • 常用枚举

    • Option<T>:表示"有值"(Some(T))或"无值"(None),避免空指针;
    • Result<T, E>:表示"成功"(Ok(T))或"错误"(Err(E)),错误处理核心。

三、指针类型(Pointer Types)

Rust 的指针类型强调内存安全,分为引用 (安全)和裸指针(不安全)。

1. 引用(Reference)

引用是"借用"数据的指针,分为不可变引用(&T)和可变引用(&mut T),遵循借用规则

  • 同一时间只能有一个可变引用或多个不可变引用;
  • 引用必须总是有效的(生命周期保证)。

特性

  • 自动解引用 :通过 . 运算符访问数据时,Rust 自动解引用(如 &x.y 等价于 (*x).y)。
  • 生命周期 :引用需标注生命周期(多数情况可自动推导),如 fn longest<'a>(x: &'a str, y: &'a str) -> &'a str
2. 裸指针(Raw Pointer)

裸指针(*const T 不可变,*mut T 可变)绕过 Rust 的安全检查,直接操作内存,需使用 unsafe 块。

特性

  • 可空(null);
  • 可同时拥有多个可变裸指针;
  • 需手动确保内存有效性和无数据竞争。

示例

rust 复制代码
let mut num = 5;  
let r1 = &num as *const i32;  // 不可变裸指针  
let r2 = &mut num as *mut i32;  // 可变裸指针  

unsafe {  
    println!("r1: {}", *r1);  // 5  
    *r2 = 10;  
    println!("r2: {}", *r2);  // 10  
}  
3. 智能指针(Smart Pointers)

智能指针是标准库提供的结构体 ,实现了 DerefDrop trait,用于管理动态内存(如堆分配),常见类型:

  • Box<T>:堆分配单个值(如递归类型);
  • Rc<T>:引用计数(单线程共享所有权);
  • Arc<T>:原子引用计数(多线程共享所有权);
  • RefCell<T>:内部可变性(运行时借用检查);
  • Mutex<T>:互斥锁(多线程安全访问)。

四、动态大小类型(Dynamically Sized Types, DST)

动态大小类型的大小在编译时未知,必须通过指针间接使用(如引用、智能指针)。

类型 描述 示例
str 字符串切片(UTF-8 编码,长度动态) &str(如 "hello")、Box<str>
[T] 数组切片(元素类型 T,长度动态) &[i32](如 &[1, 2, 3])、Vec<T>
dyn Trait Trait 对象(实现 Trait 的动态类型) &dyn DisplayBox<dyn Animal>

五、Never 类型(!

! 称为"Never 类型",表示永远不会返回的值 ,用于函数返回类型时表示该函数在执行完毕前会终止(如 panic!、无限循环)。

示例

  • panic!("出错了") 的返回类型是 !
  • 无限循环 loop {} 的返回类型是 !
  • 函数 fn exit(code: i32) -> ! { /* 终止进程 */ }

六、其他类型

  • 函数类型fn(i32) -> i32 表示一个接受 i32 并返回 i32 的函数。
  • 闭包类型 :自动生成的匿名类型,实现 FnFnMutFnOnce trait(区分捕获变量的方式)。
  • 类型别名 :用 type 关键字给类型起别名,如 type Kilometers = i32(提高可读性)。

总结

Rust 的数据类型系统通过标量类型 (基础值)、复合类型 (组合值)、指针类型 (内存引用)、动态大小类型 (灵活长度)和Never 类型(终止标记),结合所有权机制,在保证安全的同时提供了高效的性能。理解各类类型的特性(如整数的溢出处理、数组的固定长度、引用的借用规则)是编写 Rust 代码的基础。

关联文章

【开发语言】Rust语言介绍
【Rust编程知识】在 Windows 下搭建完整的 Rust 开发环境

相关推荐
泉城老铁2 小时前
目前开源架构需要注意的安全问题
spring boot·后端
会飞的胖达喵2 小时前
Qt自动信号槽连接机制:深入解析与应用实践
开发语言·qt
ZoeGranger2 小时前
【Spring】IoC 控制反转、DI 依赖注入、配置文件和bean的作用域
后端
无奈笑天下2 小时前
银河麒麟V10虚拟机安装vmtools报错:/bin/bash解释器错误, 权限不够
linux·运维·服务器·开发语言·经验分享·bash
马卡巴卡2 小时前
分库分表数据源ShardingSphereDataSource的Connection元数据误用问题分析
后端
superman超哥2 小时前
仓颉动态特性探索:反射API的原理、实战与性能权衡
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·仓颉动态特性·反射api
骑着bug的coder2 小时前
第7讲:索引(下)——失效场景与优化实战
后端·mysql
程序员阿鹏2 小时前
@Autowired和@Resource的区别
java·开发语言·spring
Halo_tjn2 小时前
Java List集合知识点
java·开发语言·windows·算法·list