arrays - 通过函数修改结构的固定数组

标签 arrays rust iterator lifetime borrow-checker

我想创建一个具有数组的结构,该结构应具有通过某些参数修改该数组的功能。
就像我有白皮书一样,我想在该纸上的特定方向上画一条线,但是一个电话之后,我得到了错误:value used here after move
我知道问题是什么,但我不明白为什么这是一个问题以及通常如何解决。我认为我不了解该编译器错误背后的原理。
我的第二个问题是,是否有更快的方法可以通过固定大小数组中的索引更改一组值?在numpy中,我将编写arr[x1,0:y] = newVal
这是不起作用的示例:

const N: usize = 4;

fn main() {
    println!("Hello, world!");
    let bebalken = [[false; N]; N];
    let stuetzen = [[true; N]; N];


    let mut f = Feld {
        abst: [[0; N]; N],
        bebalken: &bebalken,
        stuetzen: &stuetzen,
        balken: [[0; N]; N],

    };

    f.balken_einfugen(0, 0, 1, 4, 1);
    f.balken_einfugen(1, 0, 1, 4, 1);
}


struct Feld<'a> {
    abst: [[u8; N]; N],
    bebalken: &'a [[bool; N]; N],
    stuetzen: &'a [[bool; N]; N],
    balken: [[u8; N]; N], 
  
}

impl Feld<'_> {
    pub fn balken_einfugen<'a>(mut self, x: usize, y: usize, dir: u8, r: u8, connBar: u8) {
        let imax: usize = N;

        if dir == 1 {
            for i in 0..imax {
                self.balken[x + i][y] = connBar;
            }
        };
    }
}
这里是完整的编译器错误:
error[E0382]: use of moved value: `f`
  --> src\main.rs:19:5
   |
10 |     let mut f = Feld {
   |         ----- move occurs because `f` has type `Feld<'_>`, which does not implement the `Copy` trait
...
18 |     f.balken_einfugen(0, 0, 1, 4, 1);
   |       ------------------------------ `f` moved due to this method call
19 |     f.balken_einfugen(1, 0, 1, 4, 1);
   |     ^ value used here after move
   |
note: this function consumes the receiver `self` by taking ownership of it, which moves `f`
  --> src\main.rs:35:36
   |
35 |     pub fn balken_einfugen<'a>(mut self, x: usize, y: usize, dir: u8, r: u8, connBar: u8)  {
   |                                    ^^^^

最佳答案

self作为参数的方法拥有对其被调用结构的所有权。这意味着您只能调用一次该方法,因为它消耗了该结构。
如果您想要维护该结构的所有权并多次调用该方法,则必须编写该方法,以便它可变地借用该结构而不是获得所有权,即&mut self而不是mut self
一旦在代码中进行了更改,它就会编译:

const N: usize = 4;

fn main() {
    let bebalken = [[false; N]; N];
    let stuetzen = [[true; N]; N];

    let mut f = Feld {
        abst: [[0; N]; N],
        bebalken: &bebalken,
        stuetzen: &stuetzen,
        balken: [[0; N]; N],
    };

    f.balken_einfugen(0, 0, 1, 4, 1);
    f.balken_einfugen(1, 0, 1, 4, 1);
}

struct Feld<'a> {
    abst: [[u8; N]; N],
    bebalken: &'a [[bool; N]; N],
    stuetzen: &'a [[bool; N]; N],
    balken: [[u8; N]; N],
}

impl Feld<'_> {
    // `mut self` changed to `&mut self` here
    pub fn balken_einfugen<'a>(&mut self, x: usize, y: usize, dir: u8, r: u8, connBar: u8) {
        let imax: usize = N;

        if dir == 1 {
            for i in 0..imax {
                self.balken[x + i][y] = connBar;
            }
        };
    }
}
playground

关于arrays - 通过函数修改结构的固定数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65873356/

相关文章:

python - 删除重复的 2D numpy.array

java - 这两种初始化简单数组的方法之间的区别

php - 如何在同一个 feed 中输出多个数组

types - 具有特征 : Differences of specifying an explicit lifetime bound? 的类型定义

c++ - 使用 istream_iterator 读取 N 个字符

c++ - 给定一个指向容器的指针,我如何向它添加一个项目?

rust - 如何在不冒犯借用检查器的情况下进行计算状态转换?

string - 如何传递修改后的字符串参数?

java - 使用 Iterator.next() 避免 ConcurrentModificationException

c# - 是否有修改不会使迭代器失效的 C# 集合?