能否使用非借用的切片?直接赋值切片遇编译错误求助
不行的,你没法直接拥有一个[T]类型的裸切片——这正是你遇到编译错误的核心原因,咱们一步步拆解清楚:
首先看你写的代码:
let vector = vec![1, 2, 3]; let slice = vector[1..2];
编译器抛出的错误信息如下:
error[E0277]: the trait bound
[{integer}]: std::marker::Sizedis not satisfied
--> src/main.rs:3:9
|
3 | let slice = vector[1..2];
| ^^^^^ ------------ help: consider borrowing here:&vector[1..2]
| | |
| |[{integer}]does not have a constant size known at compile-time
| = help: the traitstd::marker::Sizedis not implemented for[{integer}]
= note: all local variables must have a statically known size
为什么会出现这个错误?
Rust里的裸切片类型[T]是动态大小类型(DST),它的实际长度只有在运行时才能确定,而栈上的局部变量要求在编译阶段就必须有固定的内存大小——这是Rust内存安全和性能保证的基础规则。Sized trait正是用来标记那些编译期大小固定的类型,显然[T]不符合这个要求,所以编译器直接阻止了你这种写法。
正确的处理方式有两种:
1. 借用切片(最常用的场景)
如果你只是需要临时访问原Vec的一部分数据,完全可以按照编译器的提示,用&来借用切片:
let vector = vec![1, 2, 3]; let slice = &vector[1..2]; // 类型为 &[i32],是一个胖指针
&[T]是所谓的“胖指针”,它包含两个固定大小的字段:切片数据的起始内存地址,以及切片的长度。在64位系统里它占16字节(两个64位指针的大小),编译期就能确定大小,完全符合局部变量的要求。
2. 拥有独立的切片数据
如果你不想依赖原Vec,想要自己持有这部分数据的所有权,那可以把切片转换成Vec<T>——Vec本身就是拥有动态数组所有权的类型,它把数据存在堆上,栈上只存储胖指针(和&[T]结构类似,但拥有所有权):
let vector = vec![1, 2, 3]; let owned_slice = vector[1..2].to_vec(); // 类型为 Vec<i32>,拥有独立的数据
这样owned_slice就和原vector完全独立了,你可以随意修改、移动它,不用考虑原容器的生命周期。
总结一下:
- 不能直接拥有
[T]类型的裸切片,因为它是动态大小类型,没有固定的编译期内存大小 - 临时访问用
&[T]借用切片,简单高效 - 需要独立持有数据时,用
Vec<T>来替代“拥有切片”的需求
内容的提问来源于stack exchange,提问作者fabiim

