存在可变引用时传递不可变引用

特维尔吉斯

我有一个for循环,遍历一片Point结构。Point旨意在环路中修改了一些字段,因此含有该循环函数需要一个可变参考切片。

当我需要将指向切片的(不可变的)引用传递给迭代可变引用的for循环内的函数时,就会出现问题:

#[derive(Debug)]
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let mut grid = vec![];

    grid.push(Point { x: 10, y: 10 });
    grid.push(Point { x: -1, y: 7 });

    calculate_neighbors(&mut grid);
}

fn calculate_neighbors(grid: &mut [Point]) {
    for pt in grid.iter_mut() {
        pt.x = nonsense_calc(grid);
    }
}

#[allow(unused_variables)]
fn nonsense_calc(grid: &[Point]) -> i32 {
    unimplemented!();
}

操场

error[E0502]: cannot borrow `*grid` as immutable because it is also borrowed as mutable
  --> src/main.rs:18:30
   |
17 |     for pt in grid.iter_mut() {
   |               ---------------
   |               |
   |               mutable borrow occurs here
   |               mutable borrow used here, in later iteration of loop
18 |         pt.x = nonsense_calc(grid);
   |                              ^^^^ immutable borrow occurs here

编译器抱怨grid不能将其借为不可变的,因为可变借位已经存在。这是正确的,并且我可以看到它正在尝试防止的问题,但是如何实现需要做的事情?理想情况下,我不必创建的副本grid,因为这可能会很昂贵。

丹尼斯·塞古雷

避免借用数组进行迭代的解决方案是使用索引:

fn calculate_neighbors(grid: &mut [Point]) {
    for i in 0..grid.len() {
        grid[i].x = nonsense_calc(grid);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

存在可变类的引用时如何设置类的不可变性

多个不可变引用

当返回对范围外的值的可变引用的不可变引用时,为什么在范围结束时丢弃了可变引用?

对不可变数据的可变引用

如何使Rust可变引用不可变?

如何可变引用不可变值

混合对HashMap的可变和不可变引用

获得对不可变变量的可变引用?

println内部的可变和不可变引用

返回传递给函数的不可变引用后面的可变引用

当我们永远不能同时拥有可变引用时,我们如何将可变引用强制转换为不可变引用?

引用不可变的Python集合

如何声明只读不可变引用?

如何更新对不可复制类型的可变引用?

如何在Rust中解释对可变类型的不可变引用?

可变引用在闭包内部变为不可变

对Haskell中不可变数据的可变引用

有没有办法使不可变的引用可变?

在带有可变模板功能的labmda中传递文字的正确引用时出现段错误

Rust中的可变按引用传递

C ++不可变的自定义类通过引用或值传递

为什么存在对 rust 中复制类型的不可变引用?

当第二次调用另一个函数时,如何告诉编译器传递给函数的不可变引用不再存在?

读取可变引用与不可变引用具有不同的生命周期语义

添加时对i32的不可变引用和可变引用有什么区别?

当范围中仍然有不可变的借用字符串切片引用时,为什么编译器不会对此可变借用发生错误?

Python中具有弱引用的不可变对象

具有不可变参数的自引用枚举

如何创建一对相互引用的不可变Scala实例?