番外-rust切片字面量
Rust 切片字面量(Slice Literals)详解
切片字面量是 Rust 中用于表示固定长度数组的一部分的引用。切片是一种轻量级的、对底层数组数据的引用,它的设计目的是操作集合中的部分数据,而不复制数据本身。
1. 什么是切片字面量?
切片字面量是 &[T]
类型的引用,用来表示对一个数组或类似数据结构的连续部分的引用。
示例:
let slice: &[i32] = &[1, 2, 3]; // 切片字面量
[1, 2, 3]
是一个数组字面量,类型为[i32; 3]
。&[1, 2, 3]
是对数组的引用(切片),类型为&[i32]
。- 切片不会复制数组数据,而是通过引用共享访问权。
2. 切片的来源
切片字面量可以通过以下几种方式创建:
(1) 直接定义切片字面量
let slice: &[i32] = &[1, 2, 3]; println!("{:?}", slice); // 输出: [1, 2, 3]
(2) 从数组生成切片
let arr = [1, 2, 3, 4, 5]; let slice = &arr[1..4]; // 引用数组的一部分 println!("{:?}", slice); // 输出: [2, 3, 4]
(3) 从字符串生成切片
字符串切片是 Rust 中另一种常见的切片字面量形式:
let s = String::from("hello"); let slice = &s[0..2]; // 引用字符串的一部分 println!("{}", slice); // 输出: he
3. 切片字面量的特点
-
引用类型
- 切片字面量是引用类型,不会创建新的数据,也不会复制数据。
- 它只引用底层数组的部分或全部数据。
-
固定大小(不可动态增长)
- 切片的大小是固定的,它只能引用连续的一块内存。
-
只读访问
- 切片默认是不可变的。如果需要修改切片中的数据,需要使用可变引用。
-
共享访问
- 多个切片可以引用同一个数组,这使得共享数据更高效。
4. 切片字面量的用途
(1) 作为函数参数
切片字面量常用来接受数组或字符串的一部分:
fn print_slice(slice: &[i32]) { for num in slice { println!("{}", num); } } let arr = [10, 20, 30, 40]; print_slice(&arr[1..3]); // 输出: 20, 30
(2) 高效操作集合
切片可以操作数组或字符串的部分内容,而无需复制数据:
let arr = [1, 2, 3, 4, 5]; let slice = &arr[0..3]; println!("{:?}", slice); // 输出: [1, 2, 3]
(3) 字符串切片
字符串切片用来引用字符串的一部分,广泛应用于字符串操作:
let s = String::from("Hello, Rust!"); let slice = &s[7..11]; // Rust! println!("{}", slice);
5. 切片字面量与数组的区别
特性 | 数组 ([T; N] ) |
切片 (&[T] ) |
---|---|---|
是否固定大小 | 是 | 否,动态引用部分数据 |
是否可以修改 | 是(需声明可变) | 默认不可修改 |
是否占用额外内存 | 是(直接存储数据) | 否(只存引用地址) |
常见用途 | 存储静态、固定数据 | 操作数组或集合的一部分 |
6. 切片字面量的底层实现
切片在底层由两个部分组成:
- 指向数据的指针。
- 长度信息(表示切片的大小)。
这使得切片既可以高效共享底层数据,也可以通过长度限制其范围。
7. 可变切片字面量
如果需要通过切片修改数据,可以使用可变引用(&mut
):
let mut arr = [1, 2, 3, 4]; let slice = &mut arr[1..3]; slice[0] = 20; println!("{:?}", arr); // 输出: [1, 20, 3, 4]
总结
切片字面量(&[T]
)是 Rust 中一种高效操作集合的一部分的工具:
- 它可以动态引用数据,而不复制数据。
- 常用作函数参数,支持共享或修改底层数据。
- 是 Rust 安全性和性能优化的重要组成部分。
类型比较匹配
类型匹配规则
- &arr[1..4] 是一个切片引用,类型为 &[i32]。
- [1, 4, 5, 4] 是一个数组,类型为 [i32; 4]。
Rust 的比较操作要求两边的类型必须完全一致,因此切片引用 &[i32] 不能直接与数组 [i32; 4] 进行比较。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探