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.
- Silke Hahn
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.
Neuerungen bei den Arrays und const-Expressions
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
}
Formale Anerkennung für einen Zufallstreffer aus Rust 1.38
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];
}
Typdefinition von File und sichere Assignments
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)