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

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;
    }
}

编译时,我得到一个错误:

error[E0594]: cannot assign to immutable field `i.x`
  --> src/main.rs:16:9
   |
16 |         i.x = i.x + 10;
   |         ^^^^^^^^^^^^^^ cannot mutably borrow immutable field

正如我在here中了解到的,Rust不允许在迭代时修改 struct ,因此会出现错误.

如何以优雅的方式修改它?如果我读了this answer并把它读对了,我就会想到以下几点:

  1. 从矢量中弹出项目,修改它并将其推回.
  2. 如何创建临时 struct (如何将临时 struct 替换为临时 struct ?).

虽然我认为我可以开始工作,但我对这些流行音乐和推送音乐并不满意(这是高性能的吗?).关于(2),我不知道如何让它工作——如果这真的能工作的话.

Questions:

  1. (2)是一种解决方案吗?如果是,它会是什么样子?
  2. 还有其他解决方案吗?
  3. 不同解决方案的优缺点是什么,尤其是在性能方面?

推荐答案

不能修改正在迭代的 struct ,即向量points.但是,修改从迭代器获得的元素完全没有问题,只需 Select 可变:

for i in points.iter_mut() {

或者,使用更现代的语法:

for i in &mut points {

易变性是 Select 性加入,因为易变性迭代进一步限制了在迭代时使用points可以做什么.由于可变别名(即两个或多个指向同一内存的指针,其中至少有一个是&mut)是被禁止的,所以当iter_mut()迭代器存在时,你甚至不能从points中 Select read.

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

我怎样才能从一个Rust 的日期中go 掉3年?

关于Rust 中回归的逻辑

如何使用 list 在Rust for Windows中编译?

从Type::new()调用函数

关于 map 闭合求和的问题

如何防止Cargo 单据和Cargo 出口发布( crate )项目

如何使用reqwest进行异步请求?

为什么BufReader实际上没有缓冲短寻道?

如何重命名 clap_derive 中的子命令占位符?

Rust 1.70 中未找到 Trait 实现

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

枚举的利基优化如何在 Rust 中工作?

从光标位置旋转精灵

使用 lalrpop 在 rust 中解析由 " 引用的字符串

有没有办法通过命令获取 Rust crate 的可安装版本列表?

我如何将 google_gmail1::Gmail> 传递给线程生成?

深度嵌套枚举的清洁匹配臂

如何从 Rust 中不同类型的多个部分加入 Path?

如果返回类型是通用的,我可以返回 &str 输入的一部分吗?