Ich möchte das machen:
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();
}
Dieser Code löst jedoch einen Compilerfehler aus:
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
Mithilfe von können
Cell<T>
Sie die Veränderbarkeit auf Feldebene emulieren:use std::cell::Cell; struct Point { x: i32, y: Cell<i32>, } impl Point { fn up(&self) { self.y.set(self.y.get() + 1); } } fn main() { let p = Point { x: 0, y: Cell::new(0) }; p.up(); println!("y: {:?}", p.y); }
Dies wird gedruckt
y: Cell { value: 7 }
und wir haben erfolgreich aktualisierty
.Wenn Sie den
nightly
Kanal verwenden, können Sie außerdem#![feature(cell_update)]
über Ihrer.rs
Datei deklarieren und die folgende Syntax in Ihrerup()
Methode verwenden:impl Point { fn up(&self) { self.y.update(|x| x + 1); } }
Hinweis: Diese Funktion ist eine experimentelle API nur für die Nacht.
Aus der Programmiersprache Rust bei Rust 1.7 .
quelle
Rc<Cell<i32>>
...y: Rc::new(Cell::new(0)),
.