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

如何将不可变slice传入接收&mut impl Read参数的Rust函数

Rust 切片传入Read参数问题解答

核心前提:Rust标准库为不可变字节切片&[u8]实现了Read trait,该实现的read方法仅修改切片自身的胖指针属性(起始地址、长度),将已读部分从切片范围中移除,不会修改切片指向的底层存储数据。

1. 两种写法的区别

  • 第一种写法中&mut &vector[..]是直接对临时创建的匿名切片取可变引用:临时值没有被绑定到不可变变量上,默认允许可变借用,因此编译通过。
  • 第二种写法中你先将切片绑定到了不可变变量let slice = &vector[..];:Rust默认禁止对不可变变量进行可变借用,而read方法需要修改切片变量本身的胖指针值,因此触发cannot borrow as mutable报错。

2. 为什么vector不需要声明mut也能运行

Read对&[u8]的实现不会修改切片指向的底层数据,仅修改切片自身的胖指针数值:整个过程没有修改vector的元素、长度、容量等任何属性,vector全程处于只读状态,因此不需要加mut声明。

3. 正确传入&[u8]切片的方法

有两种可行写法:

  1. 直接传入临时切片的可变引用,也就是你第一种已经跑通的写法:
    fn main() {
        let vector = vec![1, 2, 3, 4];
        read_something(&mut &vector[..]);
    }
    
  2. 将切片绑定到可变变量后再传入:
    fn main() {
        let vector = vec![1, 2, 3, 4];
        // 将切片变量声明为mut,允许修改其胖指针属性
        let mut slice = &vector[..];
        read_something(&mut slice);
    }
    

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:45:02