Rust 在迭代过程中修改结构是否有一个优雅的解决方案?

Rust 在迭代过程中修改结构是否有一个优雅的解决方案?,rust,Rust,我试图构建一个点向量,这些点在迭代过程中发生了变化: struct Point { x: i16, y: i16, } fn main() { let mut points: Vec<Point> = vec![]; // unsure if point is mutable points.push(Point { x: 10, y: 10 }); // thus trying it explicitly let mut p1

我试图构建一个点向量,这些点在迭代过程中发生了变化:

struct Point {
    x: i16,
    y: i16,
}

fn main() {
    let mut points: Vec<Point> = vec![];
    // unsure if point is mutable
    points.push(Point { x: 10, y: 10 });
    // thus trying it explicitly
    let mut p1 = Point { x: 20, y: 20 };
    points.push(p1);

    for i in points.iter() {
        println!("{}", i.x);
        i.x = i.x + 10;
    }
}
据我所知,Rust不允许在迭代时修改结构,因此会出现错误

如何以优雅的方式修改它?如果我阅读并正确理解,我会想到以下几点:

  • 从矢量中弹出项目,修改它并将其推回
  • 创建一个临时结构,我将更改的项目推送到其中,并将原始结构替换为循环外部的临时结构(如何?)
  • 虽然我认为我可以开始工作,但我对这些流行音乐和推送音乐并不满意(这是高性能的吗?)。关于第(2)项,我不知道如何让它工作——如果这能工作的话

    问题:

  • (2)是一种解决方案吗?如果是,会是什么样子
  • 还有其他解决办法吗
  • 不同解决方案的优缺点是什么,特别是在性能方面

  • 您不能修改正在迭代的结构,即向量
    。但是,修改从迭代器获得的元素是完全没有问题的,您只需选择可变性:

    for i in points.iter_mut() {
    
    或者,使用更现代的语法:

    for i in &mut points {
    

    可变性是可选的,因为可变迭代进一步限制了您在迭代时可以使用
    。由于禁止可变别名(即指向同一内存的两个或多个指针,其中至少有一个是
    &mut
    ),因此在
    iter\u mut()
    迭代器已经存在。

    现在你可以为i-in&mut点编写
    ,因为它使用了
    迭代器
    特性。@chrismorge,对了,我一直忘了这个。谢谢。适用于一个循环,但不适用于嵌套:
    用于i in&mut points.iter(){用于j in points.iter(){//一些东西并计算a}i.x=i.x+a;//错误:无法分配给不可变字段“i.x”
    @Chris,该字段应给出与
    点相关的终生错误,而不是与
    i
    相关的任何错误。事实上,当我在游戏笔中键入它时,它确实会这样做:这一次没有简单的解决方法(
    &mut
    指针必须永不别名),所以您应该写一个单独的问题,完整地解释您要做的事情,以及为什么它需要可变性和嵌套循环。