loops - 如何在同一个向量上循环两次?
问题描述
我正在尝试更新向量的元素,知道彼此在哪里,即测试所有元素对(无序),同时更改它们。所以我开始天真地写这个:
for x in &mut v {
for y in &mut v {
// ...
}
}
但是我不能可变地借用向量两次,另外,我可以简单地避免大量迭代,写下:
for x in 0..v.len() - 1 {
for y in x..v.len() - 1 {
let mut xc = &mut v[x];
let yc = &v[y];
// ...
}
}
这不起作用,因为我借用了不可变和可变引用!我该如何编写这种基本的循环?(我确实需要至少一个元素的可变性。)
解决方案
所有权的概念不会让你以可变和不可变的方式借用相同的数据,因此在安全的 Rust 中,没有可能的解决方案来获取某个索引处的数据作为可变和不可变的引用。
无论如何,这可能不是您所需要的。Rust 包含一个允许您访问切片中的多个索引的功能:
fn main() {
let mut v = vec![1, 2, 3];
let len = v.len();
for x in 0..len - 1 {
let (first, second) = v.split_at_mut(x + 1);
let xc = &mut first[x];
*xc = *xc + 1; //some code that uses xc and yc if y == x
for yc in second {
*xc = *yc + 1; //some code that uses xc and yc if y > x
}
}
}
*xc = *yc + 1
是一些使用引用的示例代码xc
和yc
. 注意x == y
必须分开处理的情况。
推荐阅读
- javascript - 附加到最近的选择
- python - Python内联代码中的With,If ...语句
- jquery - 如何创建一个“onClick”在其他3个按钮上触发“click”事件的按钮
- astronomy - 为什么我的坐标的高程是错误的,谁能解释我
- sql - 如何在 SQL 中将单条记录转换为多条记录?
- reactjs - 如何从默认命名空间发射到自定义命名空间?
- android - Google Maps Platform 拒绝了您的请求。'pb' 参数无效
- python - 使用 with open 修复 os.remove 错误会导致字符串错误
- mysql - SQL 在同一个表和查询中引用主键
- google-cloud-dataflow - Apache Beam - 如何触发空窗口?