Forum: PC-Programmierung Struct und mutable references in Rust


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Ramx1 (Gast)


Bewertung
0 lesenswert
nicht 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:
struct ObjectX {
    x: f64,
    y: f64,
    neighbours: Vec<usize>
}

impl ObjectX {
    fn add_neighbours(&mut self, all_objects: &Vec<ObjectX>) {
        for i in 0..all_objects.len() {
            let dis = ObjectX::dist(self.x, self.y, all_objects[i].x, all_objects[i].y);
            if dis < 120.0 {
                self.neighbours.push(i);
            }
        }
    }

    fn dist(x1: f64, y1: f64, x2: f64, y2: f64) -> f64 {
        let square_difference_x: f64 = (x2 - x1) * (x2 - x1);
        let square_difference_y: f64 = (y2 - y1) * (y2 - y1);
        let sum: f64 = square_difference_x + square_difference_y;
        sum.sqrt()
    }
}

fn main() {
    let mut all_objects = Vec::new();
    for _ in 0..100 {
        let obj = ObjectX { x: 1.0, y: 1.0, neighbours: Vec::new() };
        all_objects.push(obj);
    }

    for i in 0..all_objects.len() {
        all_objects[i].add_neighbours(&all_objects);
    }
}


Das führt zur folgenden Fehlermeldung:
error[E0502]: cannot borrow `all_objects` as immutable because it is also borrowed as mutable
  --> src/main.rs:33:39
   |
33 |         all_objects[i].add_neighbours(&all_objects);
   |         -----------    -------------- ^^^^^^^^^^^^ immutable borrow occurs here
   |         |              |
   |         |              mutable borrow later used by call
   |         mutable borrow occurs here

error: aborting due to previous error

von Ramx1 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Bitte Leute. Kann mir niemand weiterhelfen? :(

von Eisenoxid (Gast)


Bewertung
0 lesenswert
nicht 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)


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

von Ramx1 (Gast)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.