Programmiersprache Rust 1.66 erweitert Enumerations und entfernt Abhängigkeiten
Enums mit Feldern dürfen neuerdings eine explizite Diskriminante erhalten, und ein neuer cargo-Befehl entfernt Dependencies aus Paketen.
- Rainald Menge-Sonnentag
Im turnusmäßigen Sechswochentakt ist das letzte Rust-Release des Jahres erschienen. Version 1.66 der Programmiersprache führt eine Ergänzung für Enumerations mit Feldern und einen neuen Befehl für den Paketmanager ein. Die ebenfalls neue Funktion black_box
dient dazu, Compiler-Optimierungen zu verhindern.
Zugewiesener Wert
Rust erlaubt das Zuweisen von Diskriminanten innerhalb eines enum bisher nur, solange es keine Felder enthält. Das ändert sich mit dem aktuellen Release, das Diskriminanten auch für Enumerations mit Feldern erlaubt, sofern diese eine Integer-Darstellung haben:
#[repr(u8)]
enum Foo {
A(u8),
B(i8),
C(bool) = 42,
D(u8),
}
Die Neuerung dient vor allem zum Zusammenspiel mit C-Code, um enums über Sprachgrenzen hinweg mit festen Werten zu ermöglichen. Allerdings ist für Enumerations mit Feldern kein Typ-Casting über as
erlaubt. Ein Handle auf die Diskriminante lässt sich über die Funktion mem::discriminant
aus der Rust-Standardbibliothek abrufen.
Entfernte Abhängigkeit und Kompilieren ohne Optimierung
Der Paketmanager cargo
erhält in Rust 1.66 einen neuen Unterbefehl: cargo remove
entfernt manuell eine Dependency aus einer Crate, also einem Paket. Er ergänzt den in Rust 1.62 eingeführten Befehl cargo add
, der dazu dient, manuell eine Abhängigkeit zu einem Crate hinzuzufügen.
Eine weitere Neuerung dient vor allem für Benchmarks und Untersuchungen des vom Compiler erzeugen Codes: Die neu stabilisierte Funktion hint::black_box
unterbindet Compiler-Optimierungen. Dazu gibt sie vor, dass sie die übergebenen Werte in beliebiger Form verarbeitet und einen Wert zurückgibt, obwohl sie tatsächlich gar nichts macht.
Das einfache Beispiel aus dem Rust-Blog lässt sich im Compiler Explorer nachvollziehen, indem man dort die Zeile mit black_box
auskommentiert und so einen Blick auf den optimierten im Vergleich zum nicht optimierten Maschinencode erhält:
use std::hint::black_box;
fn push_cap(v: &mut Vec<i32>) {
for i in 0..4 {
v.push(i);
black_box(v.as_ptr());
}
}
Weitere Neuerungen in Rust 1.66 wie ..=X
-Ranges in Patterns lassen sich dem Rust-Blog entnehmen. Wie üblich können Entwicklerinnen und Entwickler, die Rust bereits installiert haben, das aktuelle Release über rustup update stable
herunterladen. Für diejenigen, die noch kein Rust verwenden, ist das rustup-Tool auf der Download-Seite separat verfügbar.
(rme)