Rustlings切片原语练习报错:为何需添加&符号?
Rust切片E0277错误详解及你的猜想验证
你的猜想验证
- 猜想1:完全正确。
[u8]属于动态大小类型(DST),编译期无法确定它的具体长度,而栈上分配的变量必须是大小已知的类型,因此编译器直接抛出E0277错误。 - 猜想2:表述不准确。切片本身不是“原语”,而且
[T]这种动态大小的切片类型根本无法直接存储在栈上——因为大小不确定。只有切片引用&[T]是固定大小的(64位系统下包含指针和长度两个字段,共16字节),能在栈上存储。 - 猜想3:正确。添加
&后得到的&[u8]是切片引用,它的大小在编译期完全确定,栈上存储的就是这个固定大小的引用结构体,指向原数组的切片区域,直接解决了动态大小类型无法直接使用的问题。
无需添加&即可获取切片的场景
有两种常见场景不需要手动添加&:
- 隐式强制转换:当函数参数要求
&[T]时,直接传递数组切片表达式(比如arr[1..3])会被编译器自动强制转换为切片引用。示例代码:fn print_slice(slice: &[u8]) { println!("{:?}", slice); } fn main() { let arr = [1,2,3,4]; print_slice(arr[1..3]); // 无需手动加&,编译器自动转换为&[u8] } - 使用智能指针包裹:如果要把切片存储在堆上,可以直接用
Box::new(arr[1..3]),此时arr[1..3]作为动态大小类型被装箱,不需要加&。示例代码:let arr = [1,2,3,4]; let boxed_slice: Box<[u8]> = Box::new(arr[1..3]); // 直接使用切片表达式,无需&
内容的提问来源于stack exchange,提问作者Nicola Pedretti
相关产品推荐
相关产品推荐

