almessadi.
Zur Übersicht

Rusts Borrow Checker für JavaScript-Entwickler_

Der einfachste Weg, Rust-Eigentum zu verstehen, besteht darin, es nicht mit der Syntax zu vergleichen, sondern mit der Lebensdauer von Objekten.

Veröffentlicht8. Mai 2024
Lesezeit8 min read

Was Rust für JavaScript-Entwickler feindselig erscheinen lässt, ist nicht die Syntax. Es ist das Lebenszyklusmodell.

In JavaScript denken Sie normalerweise nicht direkt darüber nach, wer den Speicher besitzt. Die Laufzeitumgebung und der Garbage Collector verwalten das für Sie.

Rust zwingt die Frage in das Typsystem.

Eigentum in einem Satz

Jeder Wert hat einen Besitzer, und wenn dieser Besitzer aus dem Gültigkeitsbereich geht, wird der Wert verworfen.

Das ist das Kernmodell.

Der Compiler setzt dann die Regeln für das Ausleihen durch, sodass Sie Daten nicht versehentlich verwenden können, nachdem sie verschoben wurden, oder sie durch widersprüchliche Verweise ändern können.

Der erste Fehler, den jeder sieht

fn print_name(name: String) {
    println!("{}", name);
}

fn main() {
    let my_name = String::from("Alaeddine");
    print_name(my_name);
    println!("{}", my_name);
}

Das schlägt fehl, weil my_name in print_name verschoben wird.

Für einen JavaScript-Entwickler fühlt sich das willkürlich an. Für Rust ist es jedoch die explizite Übertragung des Eigentums.

Ausleihen statt Verschieben

Wenn die Funktion nur den Wert lesen muss, leihen Sie ihn sich aus:

fn print_name(name: &str) {
    println!("{}", name);
}

fn main() {
    let my_name = String::from("Alaeddine");
    print_name(&my_name);
    println!("{}", my_name);
}

Jetzt bleibt das Eigentum bei my_name, und die Funktion erhält eine Referenz mit einem engeren Versprechen.

Warum das existiert

Der Borrow Checker versucht nicht, Ihnen das Leben schwer zu machen. Er verhindert:

  • use-after-free-Bugs
  • Datenrennen
  • ungültige Aliasmuster

in Code, der in niedrigeren Programmiersprachen sonst kompiliert und zur Laufzeit fehlschlägt.

Die ergonomischen Kosten sind upfront. Der Vorteil ist, dass ganze Klassen von Speicherbugs zu Kompilierungsfehlern werden.

Der beste Weg, es zu lernen

Beginnen Sie nicht damit, Fehlermeldungen auswendig zu lernen.

Fragen Sie sich stattdessen:

  • Wer besitzt diesen Wert?
  • Bewege ich ihn oder leihe ich ihn mir aus?
  • Benötigt diese Funktion das Eigentum, eine Mutation oder nur eine Lese-Referenz?

Sobald diese Fragen normal werden, beginnen die Compilerfehler, wie Anleitung und nicht wie Strafe zu wirken.

Weitere Lektüre