Forum: PC-Programmierung Struct und mutable references in Rust


von Ramx1 (Gast)


Lesenswert?

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

von Ramx1 (Gast)


Lesenswert?

Bitte Leute. Kann mir niemand weiterhelfen? :(

von Eisenoxid (Gast)


Lesenswert?

Dieses Forum beschäftigt sich nunmal nicht mit Rust.
Ich selber muss es (unfreiwilligerweise) nutzen und
bin schon oft über diesen Checker gestolpert. Naja

Immerhin scheint hier das Problem beschrieben zu sein:
https://stackoverflow.com/questions/47618823/cannot-borrow-as-mutable-because-it-is-also-borrowed-as-immutable

Vielleicht hilft dir das. Rust meckert über jede
Kleinigkeit, in z.b. C++ wäre sowas trivial

von cppbert (Gast)


Lesenswert?

Reddit rust programming ist die offizielle und grösste Community - da 
wird dir schnell geholfen

von Ramx1 (Gast)


Lesenswert?

Ok danke. Ich muss wohl sowieso nochmal in Ruhe die Rust Konzepte 
lernen.
Ich bin gerade ziemlich gefrustet und merke dass man mit herum probieren 
und Halbwissen nicht weit kommt. Wird erstmal nix mit der Idee durch die 
Praxis zu lernen. Variablen als mutable und Referenzen deklarieren zu 
können verkompliziert sehr schnell den ganzen Code und irgendwann weiß 
ich nicht mehr wirklich was ich tue.
Also wieder an die Theorie und sich zur Tode gähnen :D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.