我试图更新一个矢量的元素,知道彼此的位置。即 测试所有的元素对(无序),同时改变它们。于是,我开始天真地写下了这个。
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
必须单独处理。