临时别名可变引用的最佳方法是什么?
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
。但是,我无法索引到 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
会 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 上查看。
我正在尝试根据某些条件修改两个数组之一(在可变借用之后)。最好的方法是为可变借用创建一个临时别名,如以下(未编译)代码所示:
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
。但是,我无法索引到 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
会 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 上查看。