Programmiersprache: Rust 1.50 bewegt sich in Richtung stabiler const-Generics

Die erste Version unter dem Dach der Rust Foundation ergänzt die Library, stabilisiert die const-Generics und adelt dabei einen Zufallstreffer aus Rust 1.38.

In Pocket speichern vorlesen Druckansicht 191 Kommentare lesen

(Bild: Callum Bainbridge / Shutterstock.com)

Update
Lesezeit: 4 Min.
Von
  • Silke Hahn
Inhaltsverzeichnis

Das Rust-Team hat Version 1.50 der bei Mozilla entstandenen Programmiersprache veröffentlicht – das Update umfasst überarbeitetes Array Indexing, erweiterten sicheren Zugang zu Union Fields und einige Ergänzungen in der Standard-Library.

Mit den jüngsten Änderungen bewegt sich die Programmiersprache offenbar weiter auf die Stabilisierung der const-Generics zu und hegt ungültige Werte (die in Rust "Niches" heißen) auf Unix-Plattformen weiter ein. Version 1.50 ist zugleich die erste Version unter dem Dach der neu gegründeten eigenständigen Rust Foundation, die vor vier Tagen an den Start ging.

Das stabile Release 1.50 umfasst Implementierungen von ops::Index und IndexMut für die Arrays [T; N] bei nun jeglicher Länge von const N. Der indizierende Operator [] war durch eingebauten "Compiler-Zauber" auf Arrays zwar bereits funktionstüchtig, aber auf dem Level der Typen hatten Arrays bislang die Bibliothekseigenschaften noch nicht angewandt. Die Neuerung bedeutet für Rust-Programmierer einen wichtigen Schritt in Richtung stabiler const-Generics, lässt sich dem Blogeintrag des Rust-Teams entnehmen, wo sich auch Beispielcode dafür findet:

fn second<C>(container: &C) -> &C::Output
where
    C: std::ops::Index<usize> + ?Sized,
{
    &container[1]
}

fn main() {
    let array: [i32; 3] = [1, 2, 3];
    assert_eq!(second(&array[..]), &2); // slices worked before
    assert_eq!(second(&array), &2); // now it also works directly
}

Arrays lassen sich in Rust als Liste (a, b, c) oder Wiederholung (x; N) schreiben. Für Längen N größer als 1 ist Wiederholung nur für x-Werte möglich, die eine Copy sind. Angedacht war, dass hier alle const-Expressions erlaubt sein sollen (siehe RFC 2203). Für willkürlich gesetzte Ausdrücke war das Feature zwar instabil, allerdings kam es in Rust 1.38 zufällig zu einer stabilen Umsetzung durch die Verwendung von const-Werten in der Array-Wiederholung. Diese Stabilisierung erkennt Rust 1.50 nun formal als Feature an. Um "temporär" bezeichnete Konstanten zu vermeiden, sollen sich const-Expressions künftig als syntaktisches Element inline einbinden lassen (zu schreiben mit geschweiften Klammern als const { ... }, eine Zusammenfassung bietet RFC 2920).

Zur Veranschaulichung dient folgendes Beispiel:

fn main() {
    // This is not allowed, because `Option<Vec<i32>>` does not implement `Copy`.
    let array: [Option<Vec<i32>>; 10] = [None; 10];

    const NONE: Option<Vec<i32>> = None;
    const EMPTY: Option<Vec<i32>> = Some(Vec::new());

    // However, repeating a `const` value is allowed!
    let nones = [NONE; 10];
    let empties = [EMPTY; 10];
}

Das Release fügt der Typdefinition von File auf Unix-Plattformen eine neue Niche zu, wodurch nun offenbar auch -1 in der Layout-Optimierung vewendbar wird. File besteht aus dem ganzzahligen File-Descriptor, wobei bislang der Wert -1 unzulässig war – denn die Ausgabe von -1 nach Systemaufrufen war bereits mit der Botschaft belegt, dass ein Fehler aufgetreten ist. Neuerdings kann Option<File> so kodiert werden, dass None sich auch als -1 speichern lässt. Option<File> benötigt dann keinen zusätzlichen Speicherplatz.

Weitere Änderungen betreffen sichere Assignments zu den ManuallyDrop<T>-Union-Fields – zuvor waren sichere Zuschreibungen noch auf Copy-Typen beschränkt, und die Library hat neun neue stabile Funktionen erhalten: bool::then, btree_map::Entry::or_insert_with_key, f32::clamp, f64::clamp, hash_map::Entry::or_insert_with_key, RefCell::take, slice::fill, Ord::clamp und UnsafeCell::get_mut. Eine Reihe weiterer Funktionen (die bereits existiert hatten) sind nun zu const geworden, zum Beispiel pow,saturating_pow und wrapping_pow für ganzzahlige Typen sowie die das Layout betreffenden Funktionen Layout::size, Layout::align und Layout::from_size_align.

Weitere kleinere Änderungen lassen sich den Release Notes auf GitHub entnehmen. Rust-Entwickler, die bereits eine Vorgängerversion installiert haben, können das Upgrade mit einer Zeile Code durchführen:

$ rustup update stable

Alternativ lässt sich Rust 1.50 auch mit dem Tool rustup laden, eine nähere Beschreibung findet sich auf der Installationsseite der Programmiersprache. Mehr Details zur neuen Version finden Interessierte im Blogeintrag des Rust-Teams.

Update-Hinweis [12.02.2021]: Fehler im fünften Absatz behoben – nicht File, sondern Option<File> ist hier gemeint.

(sih)