1. ホーム
  2. rust

[解決済み] 構造体のフィールドをメソッドから変異させるには?

2022-02-19 05:58:13

質問

こんなことをしたいのですが。

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では、ミュータビリティは継承されます。データの所有者が、その値をミュータブルにするかどうかを決定します。しかし、参照は所有権を意味しないので、参照自身は不変であることも、変更可能であることもあります。詳しくは オフィシャルブック これらの基本的な概念をすべて説明しています。