问题描述
我正在尝试根据某种条件修改两个数组之一(在可变借项后面)。最好的方法是为可变借项创建一个临时别名,如以下(而非编译)代码所示:
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。因此导致以下原因,我不喜欢以下代码。
- array_to_change为
&mut &mut
,即使它仅表示一种间接级别,即对数组的引用。
即使我无意对 - 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上查看。