Rust开发之——Slice(12)

一 概述

  • Slice 的基本概念
  • 字符串 Slice(&str)
  • 其他类型的 Slice
  • Slice 的核心优势

二 Slice 的基本概念

2.1 定义与作用

1
2
-Slice 是一种不拥有数据所有权的引用类型,允许引用集合中一段连续的元素序列(如字符串、数组等),而非整个集合。
-核心价值:避免因传递部分数据导致的所有权转移问题,确保引用始终与底层数据同步。

2.2 问题引入

1
2
-示例:通过first_word函数寻找字符串中首个单词时,若返回字节索引usize,当原字符串被修改(如clear()),索引会失效。
-解决方案:使用 Slice 引用部分数据,编译器会确保引用有效性,避免悬空引用。

三 字符串 Slice(&str)

3.1 语法与创建

1
2
3
4
5
6
7
8
9
10
11
12
1、范围切片:
用&[start..end]指定区间(左闭右开),如&s[0..5]表示从索引 0 到 4 的字符。

2、简写形式:
-从开头切:&s[..end]等价于&s[0..end]。
-切到末尾:&s[start..]等价于&s[start..len]。
-全切:&s[..]等价于&s[0..len]。

3、示例
let s = String::from("hello world");
let hello = &s[0..5]; // "hello"
let world = &s[6..11]; // "world"

3.2 核心特性

1
2
3
-不可变性:默认不可变,需配合&mut获取可变切片(遵循借用规则)。
-UTF-8 安全:切片索引必须位于合法 UTF-8 字符边界,否则编译报错。
-字面值本质:字符串字面值(如"hello")本质是&str类型,存储于二进制文件中,不可变。

3.3 函数参数优化

1
2
3
4
5
1、将函数参数从&String改为&str,提升通用性
fn first_word(s: &str) -> &str { ... } // 可接受&String和&str

2、优势:
避免重复处理不同类型,编译器确保引用与原数据生命周期一致

四 其他类型的 Slice

1
2
3
4
5
1、数组切片:
如let a = [1,2,3,4,5]; let slice = &a[1..3];,类型为&[i32],原理与字符串切片一致。

2、集合通用性:
适用于数组、Vector 等集合类型,通过切片引用部分元素,避免复制整个集合。

五 Slice 的核心优势

1
2
3
4
5
6
7
8
1、内存安全:
编译器确保切片引用始终指向有效数据,避免悬空引用(如原数据被释放后仍使用切片)。

2、性能优化:
无需复制数据,仅存储引用和长度,减少内存开销。

3、API 通用性:
统一处理String和字符串字面值,提升代码复用性。

六 参考

  • Rust中文官网——Slice 类型