首页 > 解决方案 > 临时别名可变引用的最佳方法是什么?

问题描述

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

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
        }
    }
}

&中的&mut值被移动到,因为值没有实现特征。所以我想,使用引用,和. 但是,我无法索引and ,即使它们是对可变引用的引用。所以这导致下面的代码我不喜欢有两个原因。arr1arr2array_to_change&mutCopy&arr1&arr2arr1arr2

  1. array_to_change&mut &mut即使它只是表示一个间接级别,也就是对数组的引用。
  2. 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
        }
    }
}

有更好的解决方案吗?

标签: rustreferencemutability

解决方案


当然,&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...
        }
    }
}

在操场上看到它。


推荐阅读