临时别名可变引用的最佳方法是什么?

问题描述

我正在尝试根据某种条件修改两个数组之一(在可变借项后面)。最好的方法是为可变借项创建一个临时别名,如以下(而非编译)代码所示:

fn main() {
    let mut x = [1;5];
    let mut y = [1;5];
    
    modify_arrays(&mut x,&mut y);
}

fn modify_arrays<'a>(arr1: &'a mut [u8],arr2: &'a mut [u8]) {
    if arr1.len() == arr2.len() {
        for i in 0 .. arr1.len() {
            let array_to_change = if i % 2 == 0 {
                arr1
            } else {
                arr2
            };
            
            array_to_change[0] += 1;// example computation on array_to_change...
        }
    }
}

arr1 / arr2中的&mut值被移至array_to_change,因为&mut值未实现Copy trait。因此,我认为使用引用&arr1&arr2。但是,即使它们是对可变引用的引用,我也无法索引到arr1和arr2。因此导致以下原因,我不喜欢以下代码。

  1. array_to_change为&mut &mut,即使它仅表示一种间接级别,即对数组的引用。
  2. 即使我无意对
  3. arr1和arr2都声明为可变的。
fn modify_arrays<'a>(mut arr1: &'a mut [u8],mut arr2: &'a mut [u8]) {
    if arr1.len() == arr2.len() {
        for i in 0 .. arr1.len() {
            let array_to_change = if i % 2 == 0 {
                &mut arr1
            } else {
                &mut arr2
            };
            
            array_to_change[0] += 1;// example computation on array_to_change...
        }
    }
}

有更好的解决方案吗?

解决方法

当然,&mut *arr将重新借款:

fn modify_arrays<'a>(arr1: &'a mut [u8],arr2: &'a mut [u8]) {
    if arr1.len() == arr2.len() {
        for i in 0 .. arr1.len() {
            let array_to_change = if i % 2 == 0 {
                &mut *arr1
            } else {
                &mut *arr2
            };
            
            array_to_change[0] += 1;// example computation on array_to_change...
        }
    }
}

Playground上查看。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...