For loop 如何在遍历向量的for循环中传递向量

For loop 如何在遍历向量的for循环中传递向量,for-loop,rust,immutability,mutable,borrowing,For Loop,Rust,Immutability,Mutable,Borrowing,我需要迭代一个可变向量,在for循环中,我还需要将该向量传递给一个修改当前对象的函数 pub结构向量2{ x:f64, y:f64, } pub结构行星{ 位置:Vector2, 初始速度:矢量2, 电流速度:矢量2, 半径:f64, 质量:f64, } impl行星{ 发布fn更新速度( &莫特·赛尔夫, 其他行星:&Vec, 重力常数:f64, 时间步长:f64, ) { 对于其他行星中的p{ //计算自身相对于所有其他行星的速度 } } 发布fn更新位置(&mut self){ self.

我需要迭代一个可变向量,在for循环中,我还需要将该向量传递给一个修改当前对象的函数

pub结构向量2{
x:f64,
y:f64,
}
pub结构行星{
位置:Vector2,
初始速度:矢量2,
电流速度:矢量2,
半径:f64,
质量:f64,
}
impl行星{
发布fn更新速度(
&莫特·赛尔夫,
其他行星:&Vec,
重力常数:f64,
时间步长:f64,
) {
对于其他行星中的p{
//计算自身相对于所有其他行星的速度
}
}
发布fn更新位置(&mut self){
self.position.x=self.position.x+self.curr\u速度.x;
self.position.y=self.position.y+self.curr\u-velocity.y;
}
}
fn main(){
让mut planets=Vec:::new();
行星。推(行星){
位置:向量2{x:10.0,y:10.0},
初始速度:向量2{x:1.0,y:1.0},
电流速度:矢量2{x:1.0,y:1.0},
半径:20.0,
质量:500.0,
});
对于p in&mut行星{
p、 更新_速度和行星,0.0000000000674为f64,0.0);
p、 更新_位置();
}
}
error[E0502]:无法将'planets'作为不可变项借用,因为它也是作为可变项借用的
-->src/main.rs:42:27
|
41 |对于p in&mut行星{
|              ------------
|              |
|可变借用发生在这里
|可变借用后来在这里使用
42 | p.更新速度和行星,0.0000000000674为f64,0.0);
|^^^^^^^^^此处发生不可变借用

因为行星的可变借用存在,所以不可能生成一个不变的或甚至另一个可变的值,我也看不出解决这个难题的方法。

您可以尝试使用索引来引用特定的行星,而不应用借用规则。而且您应该避免将行星的vec拆分为两部分(实际值和其他值)

pub结构向量2{
x:f64,
y:f64,
}
pub结构行星{
位置:Vector2,
初始速度:矢量2,
电流速度:矢量2,
半径:f64,
质量:f64,
}
impl行星{
fn更新所有行星的速度(
self_idx:usize,
行星:&mut-Vec,
重力常数:f64,
时间步长:f64,
) {
行星中的p{
//和其他行星一起做数学
}
}
发布fn更新位置(&mut self){
self.position.x=self.position.x+self.curr\u速度.x;
self.position.y=self.position.y+self.curr\u-velocity.y;
}
}
fn main(){
让mut planets=Vec:::new();
行星。推(行星){
位置:向量2{x:10.0,y:10.0},
初始速度:向量2{x:1.0,y:1.0},
电流速度:矢量2{x:1.0,y:1.0},
半径:20.0,
质量:500.0,
});
对于0..planets.len()中的idx{
行星::更新所有行星的速度(idx和mut行星,0.0000000000674为f64,0.0);
行星[idx]。更新_位置();
}
}

不幸的是,您不容易做到这一点,编译器只允许同时使用一个可变借用或多个借用。即使您觉得从生锈的角度来看这应该是合法的,但事实并非如此

有几种方法可以解决此问题:

  • 直接使用索引
  • 利用内部可变性
  • 有更好的解决方案来避免问题
在你的例子中,我认为使用索引是有意义的,因为你不希望当前行星位于其他行星中,所以我们可以对向量进行变异,将当前行星置于末尾,并对其他行星进行细分:

#[派生(调试)]
pub结构向量2{
x:f64,
y:f64,
}
#[导出(调试)]
pub结构行星{
位置:Vector2,
初始速度:矢量2,
电流速度:矢量2,
半径:f64,
质量:f64,
}
impl行星{
发布fn更新速度(&mut self,其他行星:&[Planet],重力常数:f64,时间步长:f64){
println!(“{:?}”,其他行星);
}
发布fn更新位置(&mut self){
self.position.x=self.position.x+self.curr\u速度.x;
self.position.y=self.position.y+self.curr\u-velocity.y;
}
}
结构防护{
fn新(切片:&'a mut[T],a:usize,b:usize)->Self{
切片交换(a,b);
自{slice,a,b}
}
fn拆分最后一个多个(&mut self)->选项{
self.slice.split_last_mut()
}
}
恳求{
fn下降(&mut自我){
self.slice.swap(self.a,self.b);
}
}
fn main(){
让mut planets=Vec:::new();
行星。推(行星){
位置:向量2{x:10.0,y:10.0},
初始速度:向量2{x:1.0,y:1.0},
电流速度:矢量2{x:1.0,y:1.0},
半径:20.0,
质量:500.0,
});
行星。推(行星){
位置:向量2{x:20.0,y:20.0},
初始速度:向量2{x:2.0,y:2.0},
电流速度:矢量2{x:2.0,y:2.0},
半径:40.0,
质量:1000.0,
});
行星。推(行星){
位置:向量2{x:40.0,y:40.0},
初始速度:向量2{x:4.0,y:4.0},
电流速度:矢量2{x:4.0,y:4.0},
半径:80.0,
质量:2000.0,
});
设len=行星。len();
设last=len-1;
因为我在0..len{
让mut g=Guard::new(&mut planets,i,last);
让(p,其他行星)=g.最后分割().展开()//不能失败
p、 更新速度(和其他行星,0.0000000000674为f64,0.0);
p、 更新_位置();
}
}
Guard
的存在只是为了避免错误,其关键功能是将我们的行星分为我们想要处理的行星和其他行星

见:


这很奇怪,因为我只是问了几乎相同的问题,似乎在任何地方都找不到答案。其他星球也一样