我想这样做:
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
答案 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。