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.

In Pocket speichern vorlesen Druckansicht 12 Kommentare lesen
Lesezeit: 2 Min.
Von
  • 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.

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.

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)