You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rustlings切片原语练习报错:为何需添加&符号?

Rust切片E0277错误详解及你的猜想验证

你的猜想验证

  • 猜想1:完全正确。[u8]属于动态大小类型(DST),编译期无法确定它的具体长度,而栈上分配的变量必须是大小已知的类型,因此编译器直接抛出E0277错误。
  • 猜想2:表述不准确。切片本身不是“原语”,而且[T]这种动态大小的切片类型根本无法直接存储在栈上——因为大小不确定。只有切片引用&[T]是固定大小的(64位系统下包含指针和长度两个字段,共16字节),能在栈上存储。
  • 猜想3:正确。添加&后得到的&[u8]是切片引用,它的大小在编译期完全确定,栈上存储的就是这个固定大小的引用结构体,指向原数组的切片区域,直接解决了动态大小类型无法直接使用的问题。

无需添加&即可获取切片的场景

有两种常见场景不需要手动添加&:

  1. 隐式强制转换:当函数参数要求&[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]
    }
    
  2. 使用智能指针包裹:如果要把切片存储在堆上,可以直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:10:31