番外-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. 切片字面量的特点

  1. 引用类型

    • 切片字面量是引用类型,不会创建新的数据,也不会复制数据。
    • 它只引用底层数组的部分或全部数据。
  2. 固定大小(不可动态增长)

    • 切片的大小是固定的,它只能引用连续的一块内存。
  3. 只读访问

    • 切片默认是不可变的。如果需要修改切片中的数据,需要使用可变引用。
  4. 共享访问

    • 多个切片可以引用同一个数组,这使得共享数据更高效。

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. 切片字面量的底层实现

切片在底层由两个部分组成:

  1. 指向数据的指针
  2. 长度信息(表示切片的大小)。

这使得切片既可以高效共享底层数据,也可以通过长度限制其范围。


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 中一种高效操作集合的一部分的工具:

  1. 它可以动态引用数据,而不复制数据。
  2. 常用作函数参数,支持共享或修改底层数据。
  3. 是 Rust 安全性和性能优化的重要组成部分。

类型比较匹配

类型匹配规则

  • &arr[1..4] 是一个切片引用,类型为 &[i32]。
  • [1, 4, 5, 4] 是一个数组,类型为 [i32; 4]。
    Rust 的比较操作要求两边的类型必须完全一致,因此切片引用 &[i32] 不能直接与数组 [i32; 4] 进行比较。
posted @   代码世界faq  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示