我如何从方法中改变结构的字段?

时间:2014-11-19 17:12:12

标签: rust mutable

我想这样做:

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

1 个答案:

答案 0 :(得分:66)

您需要使用&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