Ich probiere Rust aus und stecke in einem Problem und weiß nicht wie ich
das elegant lösen soll. Mir ist klar dass es in Rust zum selben
Zeitpunkt nur einen mutable Reference geben darf und es darf nicht
gleichzeitig einen mutable und einen immutable Reference geben.
In diesem Beispiel steckt eine mutable reference in dem self Object der
Objekt Methode add_neigbours. Es muss mutable sein damit ich die
Funktion self.neighbours.push(i) aufrufen kann.
Und nun habe ich grundsätzlich ein Problem all_objects an die Methode
add_neighbours zu übergeben. Der folgende Aufruf:
all_objects[i].add_neighbours(&all_objects);
erzeugt bereits beim Aufruf der Funktion add_neighbours eine mutable
Reference für den self Parameter der Funktion. Dadurch kann ich
all_objects weder als immutable noch als mutable Reference übergeben.
Beispielcode:
1 | struct ObjectX {
|
2 | x: f64,
|
3 | y: f64,
|
4 | neighbours: Vec<usize>
|
5 | }
|
6 |
|
7 | impl ObjectX {
|
8 | fn add_neighbours(&mut self, all_objects: &Vec<ObjectX>) {
|
9 | for i in 0..all_objects.len() {
|
10 | let dis = ObjectX::dist(self.x, self.y, all_objects[i].x, all_objects[i].y);
|
11 | if dis < 120.0 {
|
12 | self.neighbours.push(i);
|
13 | }
|
14 | }
|
15 | }
|
16 |
|
17 | fn dist(x1: f64, y1: f64, x2: f64, y2: f64) -> f64 {
|
18 | let square_difference_x: f64 = (x2 - x1) * (x2 - x1);
|
19 | let square_difference_y: f64 = (y2 - y1) * (y2 - y1);
|
20 | let sum: f64 = square_difference_x + square_difference_y;
|
21 | sum.sqrt()
|
22 | }
|
23 | }
|
24 |
|
25 | fn main() {
|
26 | let mut all_objects = Vec::new();
|
27 | for _ in 0..100 {
|
28 | let obj = ObjectX { x: 1.0, y: 1.0, neighbours: Vec::new() };
|
29 | all_objects.push(obj);
|
30 | }
|
31 |
|
32 | for i in 0..all_objects.len() {
|
33 | all_objects[i].add_neighbours(&all_objects);
|
34 | }
|
35 | }
|
Das führt zur folgenden Fehlermeldung:
1 | error[E0502]: cannot borrow `all_objects` as immutable because it is also borrowed as mutable
|
2 | --> src/main.rs:33:39
|
3 | |
|
4 | 33 | all_objects[i].add_neighbours(&all_objects);
|
5 | | ----------- -------------- ^^^^^^^^^^^^ immutable borrow occurs here
|
6 | | | |
|
7 | | | mutable borrow later used by call
|
8 | | mutable borrow occurs here
|
9 |
|
10 | error: aborting due to previous error
|