Loops 如何在同一向量上循环两次?

Loops 如何在同一向量上循环两次?,loops,vector,foreach,rust,Loops,Vector,Foreach,Rust,我试图更新向量中的元素,知道彼此的位置,即测试所有元素对(无序),同时更改它们。所以我开始天真地写这篇文章: x进多出v的{ 对于y in和mut v{ // ... } } 但我不能可变地借用向量两次,另外,我可以简单地避免大量迭代,这样写: 0..v.len()中x的-1{ 对于x..v.len()中的y{ 设mut xc=&mut v[x]; 设yc=&v[y]; // ... } } 这行不通,因为我借用了一个不可变和可变的引用!如何编写这种基本的循环?(我确实需要至少一个元素的可变

我试图更新向量中的元素,知道彼此的位置,即测试所有元素对(无序),同时更改它们。所以我开始天真地写这篇文章:

x进多出v的
{
对于y in和mut v{
// ...
}
}
但我不能可变地借用向量两次,另外,我可以简单地避免大量迭代,这样写:

0..v.len()中x的
-1{
对于x..v.len()中的y{
设mut xc=&mut v[x];
设yc=&v[y];
// ...
}
}

这行不通,因为我借用了一个不可变和可变的引用!如何编写这种基本的循环?(我确实需要至少一个元素的可变性。)

所有权的概念不允许您以可变和不变的方式借用相同的数据,因此在安全的情况下,没有可能的解决方案来获取某个索引处的数据作为可变和不变的引用

这可能不是你所需要的。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
的情况必须单独处理。

一个简单而直接的选项是让
/…
中的代码使用索引
x
y
,也就是说,首先不要创建对单个向量元素的长期引用。
partition\u at\u index
重新排序切片。你想要的是
let(xc,rem)=v[x...split_first_mut().unwrap()
抱歉,我没有仔细阅读文档。我应该更新答案还是删除它?哦,当然要更新。