Programmiersprache: Rust 2021 ist flexibler bei anonymen Funktionen

Ein kleiner Schritt in der Version, ein großer Sprung bei der Edition: Rust 1.56 gibt nach den Editionen Rust 2015 und 2018 den Startschuss für Rust 2021.

In Pocket speichern vorlesen Druckansicht 8 Kommentare lesen

(Bild: rodho/Shutterstock.com)

Lesezeit: 6 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Das Rust-Team hat planmäßig Version 1.56 der Programmiersprache veröffentlicht, die den Start der neuen Edition Rust 2021 einläutet. Zu den wichtigsten Neuerungen gehört ein verändertes Capturing von Variablen in Closures und ein unter der Haube sauberes Iterieren über die Werte von Arrays statt über Referenzen.

Die turnusmäßig im Sechswochentakt erschienene Version mit der unscheinbaren Nummer 1.56 startet die erstmals im Mai angekündigte dritte Edition der Programmiersprache nach Rust 2015 und 2018. Neue Editionen führen zusätzliche Features ein, die zu Inkompatibilitäten mit den vorherigen Editionen führen können. Allerdings soll das Update so wenige Breaking Changes wie möglich mitbringen. Seinerzeit hatte Rust 2018 das Async-Await-Pattern an Bord, das als Nebenwirkung die neuen Keywords async und await mitbrachte. Das konnte zum Problem werden, wenn Code die zuvor nicht reservierten Begriffe beispielsweise als Variablennamen verwendet hat, was aber wohl selten der Fall gewesen sein dürfte.

Da die Änderungen von einer Edition zur nächsten insgesamt eher moderat sind, hat sich das Rust-Team bereits beim ersten Editionssprung 2018 gegen den Sprung auf eine neue Hauptversion ausgesprochen. Die Unterschiede von Editionen im Vergleich zu Hauptversionen erklärt ein Artikel auf Mozilla Hacks von 2018.

Entwicklerinnen und Entwickler legen für jedes Crate die jeweilige Edition fest. Daher müssen sie keine Änderungen für älteren Code vornehmen, um ihn mit Sourcecode für die jüngste Edition zu verwenden. Unter der Haube erstellt der Compiler schließlich eine einheitliche interne Darstellung für gemischten Code.

Eine große Neuerung in Rust 2021 betrifft Closures, ein Konzept für anonyme Funktionen in Rust, das ähnlich funktioniert wie Lambda-Ausdrücke in Kotlin, Java und C# oder Arrow Functions in JavaScript. Closures holen sich vor dem Verarbeiten eine Referenz zu den verwendeten Objekten aus dem Kontext. Das Binden der Variablen nennt sich Capturing.

Ab Rust 2021 holen sie sich dazu nur noch die tatsächlich genutzten Teilobjekte, also beispielsweise im Konstrukt || a.x + 1 lediglich das gefragte Feld a.x , statt das komplette Struct a zu binden. Damit ist der Zugriff auch dann noch möglich, wenn zuvor ein anderes Feld beispielsweise über drop (a.y) entfernt wurde. Bisher führt das zu einem Fehler, da Rust nicht mehr das vollständige Struct a referenzieren kann, das für die Closure aber in dem Fall nicht erforderlich ist.

Die neue Vorgehensweise gilt nur, wenn Entwicklerinnen und Entwickler die Edition 2021 aktivieren, da sie in einigen Fällen vorhandenen Code brechen kann: Potenziell ändert sich dadurch die Reihenfolge, in der Felder entfernt (drop) werden. Um in der neuen Edition das alte Verhalten zu forcieren und das gesamte Struct zu binden lässt sich der Unterstrich verwenden: let _ = &a;.

Eine weitere Neuerung ist schleichend bereits über die vergangenen Versionen in Rust eingeflossen: das Iterieren über Arrays by Value mit einem eigenen Trait. Rust 1.51 hatte dafür zunächst die API std::array::IntoIter eingeführt. Seit Version 1.53 implementieren Arrays das Trait IntoIterator, das ein direktes Iterieren über Arrays by Value in folgender Form ermöglicht:

for i in [1, 2, 3] {
    ..
}

Die Neuerung in Rust 2021 liegt hierbei unter der Haube: In den älteren Rust-Editionen ist für die Umsetzung ein Workaround erforderlich, der mit dem aktuellen Release entfällt. Den Aufruf von array.into_iter() lösen Rust 2015 und 2018 weiterhin über die Referenz als (&array).into_iter() auf.