如何将不可变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]切片的方法
有两种可行写法:
- 直接传入临时切片的可变引用,也就是你第一种已经跑通的写法:
fn main() { let vector = vec![1, 2, 3, 4]; read_something(&mut &vector[..]); } - 将切片绑定到可变变量后再传入:
fn main() { let vector = vec![1, 2, 3, 4]; // 将切片变量声明为mut,允许修改其胖指针属性 let mut slice = &vector[..]; read_something(&mut slice); }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

