Rust切片创建需引用符号的原因及切片视图概念解惑
Rust切片常见疑问解答
为什么let slice: [u8] = arr[1..3];会报错?
- 你猜的完全正确,核心原因就是**
[T]是动态大小类型(DST)**。Rust要求栈上变量的大小必须在编译期确定——栈空间是提前分配的,编译器没法给一个大小未知的变量预留位置。 arr[1..3]的结果本质是[u8]类型的切片,但你没法直接把它存在栈上。必须用&[u8](切片引用)、Box<[u8]>(装箱切片)这类「胖指针」类型持有它:这些类型在编译期大小固定,包含指向内存块的指针和切片长度两个部分。- 类比你熟悉的C++:这就像你不能直接声明
int[] x;作为栈变量,必须用int* x或者std::span<int>指代数组区间,本质都是用固定大小的类型包装动态长度的内存块。
为什么说str是内存视图,而非&str?
- 首先明确:
str本身就是字符串切片类型,属于动态大小类型,它代表的就是一段UTF-8编码的连续内存块——这就是文档所说的「连续内存块的视图」。 - 但你没法直接使用
str类型的变量(就像没法直接用[u8]一样),必须通过&str(字符串切片引用)操作它。&str是str的引用,相当于这个视图的「访问手柄」:它包含指向UTF-8内存块的指针和字符串长度,是编译期大小固定的胖指针。 - 简单说:
str定义了「视图是什么」,而&str是能让你实际访问这个视图的工具。文档里的「切片」指的是类型本身([T]、str),我们日常用的&[T]、&str是这些切片类型的引用。
内容的提问来源于stack exchange,提问作者Humble Penguin
相关产品推荐
相关产品推荐

