rust - 如何重新引用可变切片
问题描述
我想通过可变引用更新切片。
虽然这确实适用于不可变切片:
fn shrink(value: &mut &[u8]) {
*value = &value[0..2];
}
fn main() {
let a = [0; 4];
let mut a_slice: &[u8] = &a;
shrink(&mut a_slice);
println!("{:?}", a_slice);
}
它不适用于可变的:
fn shrink<'a: 'b, 'b>(value: &'a mut &'b mut [u8]) {
*value = &mut value[0..2];
}
fn main() {
let mut a = [0; 4];
let mut a_slice: &mut [u8] = &mut a;
shrink(&mut a_slice);
println!("{:?}", a_slice);
}
错误信息:
error[E0502]: cannot borrow `a_slice` as immutable because it is also borrowed as mutable
--> src/main.rs:8:22
|
7 | shrink(&mut a_slice);
| ------------ mutable borrow occurs here
8 | println!("{:?}", a_slice);
| ^^^^^^^
| |
| immutable borrow occurs here
| mutable borrow later used here
我知道有一种方法可以通过直接返回子切片来更新切片。
但是有没有办法通过可变引用重新引用可变切片成为可能?
这个问题类似于这个问题,但我不知道是什么让它如此不同,建议的解决方案不起作用。
解决方案
我不知道该代码有什么问题,但一种选择是直接返回更新后的切片:
fn shrink(value: &mut [u8]) -> &mut [u8] {
&mut value[0..2]
}
fn main() {
let mut a = [0; 4];
let mut a_slice = &mut a[..];
a_slice = shrink(a_slice);
println!("{:?}", a_slice);
}
调用者中的更新不是通过可变引用进行更新,而是清楚地表明a_slice
不再使用旧值。
推荐阅读
- python - Mongodb查询或ETL工具
- python - 如何打开 python NLTK 下载器
- visual-studio-code - 如何设置 VSCode 以将花括号放在同一行?
- complexity-theory - 确定 Big-Oh / Big-Theta 或 Big-Omega
- java - 不包含空格和至少一个“*”的字符串的正则表达式
- android - TimePickerDialog 中的 AM/PM 文本中断
- java - Java 方法和数组
- mysql - 如何在mysql触发器中将点(。)连接到像pic.jpeg这样的字符串?
- mysql - 如何将一列 INNER JOIN 连接到两个不同的列?
- objective-c - FFmpeg 跳转到最近的帧