Dev News Daily ENDE

Rusts Const-Generics-Team stellt Generic Const Args als Nachfolger von generic_const_exprs vor

Die Projektgruppe Const Generics von Rust hat das Design beschrieben, das die seit Langem instabile Funktion generic_const_exprs ablösen soll. Ein Beitrag im Blog Inside Rust vom 2. Oktober stellt Generic Const Arguments vor, kurz GCA: eine Familie von Nightly-Funktionen, mit denen mehr Arten von Ausdrücken mit generischen Parametern in Const-Generic-Argumenten stehen dürfen. Erstmals diskutiert wurde der Entwurf im Juni 2024 auf der RustFest Zürich.

Die Grenze, um die es geht. Im stabilen Rust darf ein Const-Generic-Argument ein bloßer Parameter wie { N } oder ein vollständig konkreter Ausdruck wie { 1 + 1 } sein. Typen wie [u8; N + 1] oder [u8; T::NUM_BYTES] sind nicht möglich, was laut Beitrag viele zum Crate typenum treibt.

Was GCA hinzufügt. Jeder neu unterstützte Ausdruck muss in ein Makro gca! gesetzt werden.

  • gca_adts erlaubt es, Structs, Enums, Tupel und Arrays aus generischen Parametern zu bilden, etwa gca!(Foo { field: N }) oder gca!([N1, 12]). Wiederholungsausdrücke wie [N; 2] werden noch nicht unterstützt.
  • gca_const_items macht Const-Items im Typsystem nutzbar, darunter assoziierte Konstanten ([u8; gca!(T::ASSOC)]) und generische freie Konstanten. Da ein Const-Item beliebigen Code enthalten kann, sind damit indirekt beliebige Ausdrücke möglich: gca!(N + 1) wird abgelehnt, const FOO: usize = N + 1; dagegen lässt sich verwenden. Außerdem erlaubt die Funktion Schranken wie T: Trait<ASSOC = { N }> und dyn-Typen für Traits mit assoziierten Konstanten – beides im stabilen Rust verboten. Sie setzt das instabile -Znext-solver voraus.
  • Ein Const-Item, dessen rechte Seite selbst ein gca!-Ausdruck ist, wird transparent behandelt: Der Compiler kann beweisen, dass [u8; FREE_GCA::<N>] und [u8; N] derselbe Typ sind. Ein gewöhnliches Const-Item bleibt undurchsichtig, und derselbe Vergleich scheitert.
  • gca_min_const_items ist eine kleinere Variante, die nur Const-Items mit gca!-Ausdrücken annimmt und ohne den neuen Trait-Solver auskommt.

Was es beim Schreiben kostet. Innerhalb von gca! sind Arithmetik und Funktionsaufrufe nicht erlaubt: gca!(1 + 1) ist ein Fehler, { 1 + 1 } nicht. Das Team schreibt, die Pflicht zum Makro bereite erhebliche ergonomische Probleme, und eine Lösung dafür sei noch nicht gefunden.

Rusts Const-Generics-Team stellt Generic Const Args als Nachfolger von generic_const_exprs vor
Rusts Const-Generics-Team stellt Generic Const Args als Nachfolger von generic_const_exprs vor — Dev News Daily

Was das bedeutet

Nichts davon ist stabil, und der Beitrag erklärt ein Design, er nennt keinen Zeitplan. Für Bibliotheksautoren liegt sein Wert in der Richtung: Das lange Experiment generic_const_exprs hat einen Nachfolger, und berechnete Array-Längen werden über Const-Items laufen statt über frei eingeschriebene Arithmetik. Code, der auf typenum aufbaut, hat noch keinen Grund umzuziehen.