rust - 临时别名可变引用的最佳方法是什么?
问题描述
我正在尝试根据某些条件修改两个数组之一(在可变借用后面)。最好的方法是为可变借用创建一个临时别名,如以下(非编译)代码所示:
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 ,即使它们是对可变引用的引用。所以这导致下面的代码我不喜欢有两个原因。arr1
arr2
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
将重新借用:
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...
}
}
}
在操场上看到它。
推荐阅读
- c++ - 不删除静态指针(谷歌风格)
- python - 使用 GridSearchCV 时出现什么错误?
- apache-kafka - Ktable 到 KGroupTable - 架构不可用(状态存储 ChangeLog 架构未注册)
- javascript - 有没有更优雅的方法来遍历 js 中的 json 数组?
- statistics - 统计数据:在一组中找到它们之间相关的对的捷径
- javascript - 使用应用内浏览器进行客户端下载
- php - OneLogin 和 Azure AD SAML 请求无效
- kubernetes - K8s - NFS 共享仅以只读方式挂载在 pod 中
- pine-script - 我需要我的策略来检查 80 个之前的柱的标准 x
- apache-spark - 无法创建 hive 连接 jdbc:hive2://localhost:10000。集群模式下的 spark-submit