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

What's the best way to temporarily alias a mutable reference?

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

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 特性.所以我想,使用引用,&arr1&arr2。但是,我无法索引到 arr1arr2,即使它们是对可变引用的引用。所以这导致了以下代码,我不喜欢它有两个原因。

  1. array_to_change&mut &mut,尽管它仅表示一个间接级别,即对数组的引用。
  2. arr1arr2 被声明为可变的,尽管我无意改变它们。
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 会 re-borrow:

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 上查看。