• IT-Karriere:
  • Services:

Rust macht es unmöglich, in eine geschlossene Datei zu schreiben

In Rust enthalten Funktionssignaturen also noch viel mehr: Hier übergibt die aufrufende Funktion den Besitz und die aufgerufene. Kurz heißt das hier, dass die Funktion nicht nur eine Datei als Argument kriegt, sondern dabei auch das Management übernimmt.

Stellenmarkt
  1. operational services GmbH & Co. KG, Frankfurt am Main
  2. eLearning Manufaktur GmbH, Kleve, Düsseldorf (Home-Office möglich)

Da der Lebenszyklus eines File-Pointers über das Besitzkonzept modelliert ist, haben wir die Garantie, dass das File immer offen ist. Es wird erst geschlossen, wenn der Besitzer den Besitz aufgibt. Und das ist auch die einzige Art, die Datei zu schließen, denn eine klassische close-Funktion gibt es nicht.

Da aber kein Garbage-Kollektor zum Einsatz kommt, ist der Vorgang dennoch sicher. Wir können nicht aus Versehen in geschlossene Dateien schreiben. Der zu schreibende String ist auf jeden Fall vorhanden, wir müssen aber nicht prüfen.

Schauen wir uns hier einmal einen Fehler an:

Golem Akademie
  1. Masterclass: Data Science mit Pandas & Python
    9./10. September 2021, online
  2. C++ Clean Code - Best Practices für Programmierer
    7.-11. Juni 2021, online
Weitere IT-Trainings

  1. let file = File::create("test");
  2. // Fehlerbehandlung
  3. write_to_file(file, String::from("Hallo Golem!")); // Besitzabgabe
  4. write_to_file(file, String::from("Hallo Golem!")); // !!!!

Nach meiner Erklärung zuvor sollte das Problem hier klar sein: Ich muss davon ausgehen, dass die Datei nach dem Aufruf dieser Funktion geschlossen ist - nach Rusts Verständnis also auch kein gültiger File-Pointer mehr existiert. Der Compiler erkennt diese Probleme.

  • Rust-Fehlermeldung (Bild: Florian Gilcher)
Rust-Fehlermeldung (Bild: Florian Gilcher)

Die Fehlermeldung in Gänze können Sie in diesem Playground-Link betrachten. Die Lösung für diese Fehler ist allerdings nicht direkt ersichtlich: Denn dieses Verhalten kann, wie später ausgeführt, strukturell gewünscht sein und ein Sicherheitsnetz darstellen.

Aus den Rückgabetypen können wir lesen, dass wir den Besitz nicht zurückbekommen. Wir müssen daher davon ausgehen, dass die Datei dann geschlossen ist. Wir übernehmen auch den Besitz von string_buffer, der danach aus dem Speicher entfernt wird. Möchten wir das nicht, hilft ein weiteres Sprachkonstrukt, das der Referenzen:

  1. fn write_to_file(file: File, string_buffer: &str) -> Result<usize, io::Error> {
  2. // Implementierung ausgelassen
  3. }

Hier wird eine Funktion beschrieben, die zwar das Dateimanagement übernimmt, aber nicht das Management des String-Speichers. Die Referenz ist hier eine sogenannte immutable Referenz: Sie kann mehrfach existieren und geteilt werden, aber der Besitzer des referenzierten Strings ist dafür verantwortlich (in diesem Fall die aufrufende Funktion), sie valide - und damit den String im Speicher - zu halten. Funktionen, die eine immutable Referenz erhalten, können sich sicher sein, dass der Wert hinter der Referenz sich niemals ändert. Der Compiler setzt diese Regel durch.

Ich möchte an dieser Stelle nicht zu stark auf Fehlermeldungen eingehen. Der wichtige Punkt ist hier, dass wir statt des Erstellens zweier Strings einen verwenden können.

  1. let buffer = "Hallo Golem!";
  2. write_to_file(file1, &buffer);
  3. write_to_file(file2, &buffer);

Aber wie sieht es mit der Datei aus?

  1. fn write_to_file(file: &mut File, string_buffer: &str) -> Result<usize, io::Error> {
  2. // Implementierung ausgelassen
  3. }

Im Gegensatz zum letzten Prototyp referenziert diese Funktion auch unser File. Allerdings anders, denn wir möchten in diese Datei schreiben. &mut ist hierbei eine sogenannte mutable Referenz.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Dateien öffnen und schließen in RustMutable Referenzen lösen alle Nebenläufigkeitsprobleme 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6.  


Anzeige
Spiele-Angebote
  1. gratis (bis 29.04.)
  2. 12,75€
  3. 2,99€
  4. 46,99€

Proctrap 28. Feb 2021 / Themenstart

oh wow, das ist krass, sehe gerade das nutzt https://crates.io/crates/druid

ronda-melmag 26. Feb 2021 / Themenstart

Jo ich meinte Rxjava und konsorten wobei ich für Vert.x schwärme :-) und eine Combo aus...

Filius 25. Feb 2021 / Themenstart

Was meinst du mit "DB Anwendung"? Gerade wenn man eine ordentliche Datenbank im...

Johannes321 25. Feb 2021 / Themenstart

So gemein das jetzt klingt - für die, die die Vorteile von solchen Sprachen nicht sehen...

wurstdings 25. Feb 2021 / Themenstart

Oh keine GUIs, alles singlethreaded, kein asynchroner I/O, keine Buffer? Über welche...

Kommentieren


Folgen Sie uns
       


Xiaomi MiTV Q1 im Test

Für das Streamen von Serien oder den Filmeabend zu Hause reicht der preiswerte Fernseher locker aus.

Xiaomi MiTV Q1 im Test Video aufrufen
Programm für IT-Jobeinstieg: Hoffen auf den Klebeeffekt
Programm für IT-Jobeinstieg
Hoffen auf den Klebeeffekt

Aktuell ist der Jobeinstieg für junge Ingenieure und Informatiker schwer. Um ihnen zu helfen, hat das Land Baden-Württemberg eine interessante Idee: Es macht sich selbst zur Zeitarbeitsfirma.
Ein Bericht von Peter Ilg

  1. Arbeitszeit Das Sechs-Stunden-Experiment bei Sipgate
  2. Neuorientierung im IT-Job Endlich mal machen!
  3. IT-Unternehmen Die richtige Software für ein Projekt finden

Weclapp-CTO Ertan Özdil: Wir dürfen nicht in Schönheit und Perfektion untergehen!
Weclapp-CTO Ertan Özdil
"Wir dürfen nicht in Schönheit und Perfektion untergehen!"

Der CTO von Weclapp träumt von smarter Software, die menschliches Eingreifen in der nächsten ERP-Generation reduziert. Deutschen Perfektionismus hält Ertan Özdil aber für gefährlich.
Ein Interview von Maja Hoock


    Fiat 500 als E-Auto im Test: Kleinstwagen mit großem Potenzial
    Fiat 500 als E-Auto im Test
    Kleinstwagen mit großem Potenzial

    Fiat hat einen neuen 500er entwickelt. Der Kleine fährt elektrisch - und zwar richtig gut.
    Ein Test von Peter Ilg

    1. Vierradlenkung Elektrischer GMC Hummer SUV fährt im Krabbengang seitwärts
    2. MG Cyberster MG B Roadster mit Lasergürtel und Union Jack
    3. Elektroauto E-Auto-Prämie übersteigt in 2021 schon Vorjahressumme

      •  /