私はこれをやりたい:
struct Point {
x: i32,
y: i32,
}
impl Point {
fn up(&self) {
self.y += 1;
}
}
fn main() {
let p = Point { x: 0, y: 0 };
p.up();
}
しかし、このコードはコンパイラエラーをスローします。
error[E0594]: cannot assign to field `self.y` of immutable binding
--> src/main.rs:8:9
|
7 | fn up(&self) {
| ----- use `&mut self` here to make mutable
8 | self.y += 1;
| ^^^^^^^^^^^ cannot mutably borrow field of immutable binding
&mut self
の代わりに&self
を使用し、p
変数を可変にする必要があります。
struct Point {
x: i32,
y: i32,
}
impl Point {
fn up(&mut self) {
// ^^^ Here
self.y += 1;
}
}
fn main() {
let mut p = Point { x: 0, y: 0 };
// ^^^ And here
p.up();
}
Rustでは、可変性が継承されます。データの所有者が、値が可変かどうかを決定します。ただし、参照は所有権を意味するものではないため、参照自体は不変または可変です。これらの基本概念のすべてを説明する official book を読む必要があります。