web-dev-qa-db-fra.com

Comment puis-je muter le champ d'un struct d'une méthode?

Je veux faire ça:

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();
}

Mais ce code renvoie une erreur de compilation:

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
49
alxkolm

Vous devez utiliser &mut self au lieu de &self et modifiez la variable 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();
}

Dans Rust, la mutabilité est héritée: le propriétaire des données décide si la valeur est mutable ou non. Cependant, les références n'impliquent pas la propriété et peuvent donc être elles-mêmes immuables ou modifiables. Vous devriez lire le livre officiel qui explique tous ces concepts de base.

72
Vladimir Matveev