Rust in 2021: Das sind die Pläne für die Programmiersprache

Das Rust-Logo. (Bild: Lloyd Carr/Shutterstock)
Rust ist eine moderne Programmiersprache, deren Fokus auf Thread-Safety und Performance liegt. Anders als in vielen sogenannten Higher-Level-Programmiersprachen gibt es in Rust weder Garbage Collection noch Virtual Machine. Stattdessen adressiert Rust bekannte Probleme alteingesessener Low-Level-Programmiersprachen wie C oder C++. Mit einigem Erfolg – das Interesse an der Programmiersprache nimmt zu: Erst kürzlich hat Facebook sich der Rust Foundation angeschlossen, AWS investiert in die Weiterentwicklung und Google hat angekündigt, Systembestandteile von Android künftig in Rust entwickeln zu wollen.
Die Veröffentlichung der neuen Features ist mit dem Release von Version 1.56.0 angedacht – geplantes Release-Date ist der 21. Oktober.
Diese Neuerungen kommen
Neue Features für das Prelude-Modul
Das Prelude-Modul der Rust-Standardbibliothek enthält häufig genutzte Entitäten wie beispielsweise Option
, Vec
, drop
und Clone
. Der Rust-Compiler priorisiert manuell importierte Entitäten über jene des Prelude-Moduls. So wird sichergestellt, dass sogenannte Prelude-Additions nicht dazu führen, dass bereits existenter Code nicht mehr funktioniert. In einem Crate oder Modul namens example
, das eine pub struct Option
enthält, würde use example::*;
anstelle des Option
der Standard-Library eindeutig das Option
aus dem example
-Modul referenzieren.
Soweit die Theorie. Trotzdem kann das Hinzufügen eines Traits den Code unbrauchbar machen, zum Beispiel wenn sogenannte Traits gleich benannt werden, wie jene der Standard-Library. Diesen Umstand führt das Team um Rust als den Grund dafür an, dass TryInto
nicht zu Rusts Prelude hinzugefügt wurde. Stattdessen soll Rust 2021 eine neue Prelude nutzen. Die ist identisch mit der alten, verfügt aber über drei Neuzugänge:
std::convert::TryInto
std::convert::TryFrom
std::iter::FromIterator
Der Cargo Feature Resolver wird zum Default
Seit Rust 1.51.0 verfügt Rusts Paketmanager Cargo über ein Feature, das es erlaubt, Paketversionen zu skippen, die nicht über benötigte Features verfügen. Bislang war dieser sogenannte Feature Resolver Opt-in, mit der neuen Version soll es zum Default werden.
IntoIterator für Arrays
Bis V 1.53 implementieren nur Referenzen auf Arrays IntoIterator. Das heißt, über &[1, 2,3]
und &mut[1, 2, 3]
konnte iteriert werden, aber nicht direkt über [1, 2, 3]
.
for &e in &[1, 2, 3] {} // Ok :)
for e in [1, 2, 3] {} // Error :(
Editions in Rust können gemischt verwendet werden, was die alleinige Implementierung in Edition 2021 ausschloss. Stattdessen wurde sie in alle Editions, angefangen bei 1.53.0, aufgenommen. Um Inkompatibilitäten zu vermeiden, implementierte das Team zudem einen kleinen Workaround für die into_iter()
-Methode: Die wird in Rust 2015 und 2018 nach wie vor zu (&array).into_iter()
resolved – so als würde die neue Trait-Implementation gar nicht existieren. Achtung: Das gilt nur für into_iter()
, Schreibweisen wie for e in [1, 2, 3]
oder IntoIterator::into_iter([1, 2, 3])
werden dann in allen Editions funktionieren.
Laut Blogpost wurde der Hack hinzugefügt, weil andernfalls einfach zu viel Code nicht mehr korrekt ausgeführt werden könnte. Er wirkt sich ausschließlich auf ältere Versionen aus, zusätzliche Komplexität in Edition 2021 ist dadurch nicht entstanden.
Lies auch: 3 Gründe, warum du 2021 Rust lernen solltest – und vielleicht sogar Spaß daran haben wirst
Verändertes Closure-Verhalten
Closures werden ab Edition 2021 nur noch die Felder erfassen, die sie auch verwenden. Bisher ist es so, dass sie alles erfassen, worauf sich innerhalb ihres Funktionsbodys bezogen wird. So würde eine Referenz auf a
von || a + 1
automatisch aus dem Kontext eingefangen. Derzeit gilt dies für ganze Strukturen, auch wenn nur ein Feld verwendet wird. Zum Beispiel fängt || a.x + 1
einen Verweis auf a
ein und nicht nur auf a.x.
:
let a = SomeStruct::new();
drop(a.x); // Move out of one field of the struct
println!("{}", a.y); // Ok: Still use another field of the struct
let c = || println!("{}", a.y); // Error: Tries to capture all of `a`
c();
Ab der neuen Edition wird der obenstehende Code künftig problemlos kompiliert werden können. Weil dieses neue Verhalten die Reihenfolge, in der Felder gedroppt werden, beeinflussen kann, soll das neue Feature nur in der neuen Edition aktiviert werden. Wie bei allen Editionsänderungen wird es auch hier eine automatische Migration geben.
Weitere Neuerungen
Das war aber noch längst nicht alles. Die 2021-Edition soll mit einem neuen panic!()-Makro aufwarten, außerdem wurden zwei Warnungen zu expliziten Fehlermeldungen gemacht und sogenannte Patterns sollen künftig auch |
unterstützen.
Alle Neuerungen im Detail sowie eine ausführlichere Erklärung, warum Rust in Editions released wird, sind im Blogpost der Rust Edition Working Group nachzulesen.