通过函数修改结构体的固定数组
Modify fixed Array of a Struct by function
我想创建一个具有数组的结构,并且该结构应该具有通过某些参数修改该数组的函数。
就像我有一张白纸,我想在白纸上朝特定方向画一条线,但在一次调用后,我得到错误: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;
}
};
}
}
我想创建一个具有数组的结构,并且该结构应该具有通过某些参数修改该数组的函数。
就像我有一张白纸,我想在白纸上朝特定方向画一条线,但在一次调用后,我得到错误: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;
}
};
}
}