Rust 1.40.0 Release: # [nicht erschöpfend], Makro-Verbesserungen und andere Verbesserungen

Das Rust-Team freut sich, die Veröffentlichung einer neuen Version, 1.40.0, bekannt zu geben. Rust ist eine Programmiersprache, mit der jeder zuverlässige und effiziente Software erstellen kann.


Wenn Sie die vorherige Version von Rust mit rustup installiert rustup , müssen Sie nur den folgenden Befehl rustup , um ein Upgrade auf Version 1.40.0 durchzuführen:


 $ rustup update stable 

Wenn Sie rustup noch nicht installiert rustup , können Sie es von der entsprechenden Seite unserer Website installieren und rustup zu GitHub lesen.


Was ist in der stabilen Version 1.40.0 enthalten


Die wichtigsten Neuerungen sind die Einführung des Attributs #[non_exhaustive] , Verbesserungen an macros!() Und #[attribute] . Schließlich wurden die Warnungen des Migrationsanalysators des Kreditnehmers zu Fehlern in Rust 2015. Weitere Informationen finden Sie in den Versionshinweisen.


#[non_exhaustive] Strukturen, Aufzählungen und Aufzählungsoptionen


Angenommen, Sie sind der Autor einer alpha Bibliothek, die die pub struct Foo enthält. Sie möchten die Felder der alpha::Foo Struktur öffentlich machen, sind sich jedoch nicht sicher, ob Sie Foo in zukünftigen Releases weitere Felder hinzufügen müssen. Es entsteht ein Dilemma: Entweder machen Sie die Felder mit späteren Unannehmlichkeiten privat, oder Sie riskieren, Benutzer von den Feldern abhängig zu machen und dann beim Hinzufügen neuer Felder deren Code zu verletzen. Rust 1.40.0 bietet eine Möglichkeit, das Problem mit #[non_exhaustive] zu lösen.


Das Attribut #[non_exhaustive] an die Struktur oder Variante der Aufzählung angehängt und verhindert den vollständigen Vergleich von Feldern, die Erstellung der Struktur oder Variante außerhalb der Kiste mit ihrer Deklaration. Das folgende Beispiel zeigt Fehler in der Alpha-abhängigen beta Kiste:


 // alpha/lib.rs: #[non_exhaustive] struct Foo { pub a: bool, } enum Bar { #[non_exhaustive] Variant { b: u8 } } fn make_foo() -> Foo { ... } fn make_bar() -> Bar { ... } // beta/lib.rs: let x = Foo { a: true }; //~  let Foo { a } = make_foo(); //~  let Foo { a, .. } = make_foo(); //~ OK // -- `beta`       . let x = Bar::Variant { a: 42 }; //~  let Bar::Variant { b } = make_bar(); //~  let Bar::Variant { b, .. } = make_bar(); //~ OK // -- `beta`    ... 

Was ist hinter den Kulissen los? Die Sichtbarkeit der Konstruktoren für die Struktur- oder Aufzählungsoption #[non_exhaustive] wird auf pub(crate) #[non_exhaustive] reduziert, wodurch ihre Verwendung in Kisten von Drittanbietern verboten wird.


Vielleicht ist ein wichtigerer Aspekt von #[non_exhaustive] dass ein Attribut selbst an Aufzählungen angehängt werden kann. Hier ist der Code aus std::cmp::Ordering :


 #[non_exhaustive] pub enum Ordering { Relaxed, Release, Acquire, AcqRel, SeqCst } 

In diesem Fall garantiert #[non_exhaustive] die Möglichkeit, in Zukunft neue Optionen hinzuzufügen. Dies wird erreicht, indem anderen Paketen untersagt wird, die vollständige Bildanpassung für die Ordering . Der Compiler würde Folgendes ablehnen:


 match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => { /* logic */ } //~^ ;      , //   ,        . } 

Stattdessen sollten andere Pakete jetzt die Möglichkeit neuer Aufzählungsoptionen in Betracht ziehen, z. B. das Hinzufügen des Platzhalters _ :


 match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => { /* logic */ } _ => { /* logic */ } // OK;     ,   . } 

Details zum Attribut #[non_exhaustive] im Stabilisierungsbericht .


Makro- und Attributverbesserungen


In Version 1.40.0 haben wir verschiedene Verbesserungen an Makros und Attributen vorgenommen, darunter:


  • mac!() in Typkontexten.


    Sie können zum Beispiel schreiben: type Foo = expand_to_type!(bar); Dabei ist expand_to_type ein prozedurales Makro.


  • extern { ... } Blöcken.


    Dieser Block enthält make_item!() Makros. Zum Beispiel:


     macro_rules! make_item { ($name:ident) => { fn $name(); } } extern { make_item!(alpha); make_item!(beta); } 

    Attributprozedurmakros für Elemente in extern { ... } Blöcken werden jetzt auch unterstützt:


     extern "C" { #[my_identity_macro] //~  ,     `fn foo();`. fn foo(); } 

  • macro_rules! Elemente in prozeduralen Makros.


    Makros mit Funktionssyntax ( mac!() ) Und Attributen ( #[mac] ) können jetzt macro_rules! erzeugen macro_rules! . Weitere Informationen finden Sie im beigefügten Stabilisierungsbericht.


  • TokenStream $m:meta unterstützt $m:meta TokenStream .


    Der folgende Code ist also korrekt:


     macro_rules! accept_meta { ($m:meta) => {} } accept_meta!( my::path ); accept_meta!( my::path = "lit" ); accept_meta!( my::path ( abc ) ); accept_meta!( my::path [ abc ] ); accept_meta!( my::path { abc } ); 


Migrationswarnungen des Leihgeber-Parsers werden in der Version Rust 2015 zu Fehlern


In Release 1.35.0 haben wir berichtet, dass NLL in Rust 2015 nach dem ersten Release für die Ausgabe 2018 in Rust 1.31 erschienen ist .


Wie bereits erwähnt, kann der alte Ausleihanalysator eine unsichere Speicherverwaltung ermöglichen, und mit dem neuen Analysator (NLL-Ausleihprüfung) wurden diese Mängel behoben. Da diese Fehler den stabilen Code stören könnten, haben wir uns entschlossen, diese Fehler schrittweise einzuführen, um zu prüfen, ob der alte Analyzer das Zusammenstellen des Programms zulässt und ob der neue das Programm blockiert. In diesen Fällen wurden Fehler durch Warnungen ersetzt.


Die vorherige Version von Rust 1.39.0 ersetzte diese Warnungen mit Fehlern für Code in der Ausgabe 2018 . Rust 1.40.0 wird die gleichen Änderungen am Code der Ausgabe 2015 vornehmen und diese Sicherheitslücken dauerhaft schließen. Gleichzeitig wurde der Compiler sogar vom alten Code befreit !


Wenn Ihr Projekt nicht auf die oben genannten Änderungen zurückzuführen ist oder Sie mehr wissen möchten, lesen Sie den Beitrag von Niko Matsakis .


Konstantere Funktionen in der Standardbibliothek


Ab Rust 1.40.0 wird die folgende Funktion als konstant markiert ( const fn ):



Stabile Funktionen in der Standardbibliothek


Die folgenden Funktionen und Makros wurden in Rust 1.40.0 stabilisiert:



Andere Änderungen


Die Syntax , der Frachtpaket-Manager und der Clippy-Analysator wurden ebenfalls geändert.


Bitte lesen Sie die Kompatibilitätshinweise, um festzustellen, ob sich diese Änderungen auf Sie auswirken.


Mitglieder 1.40.0


Viele Leute kamen zusammen, um Rust 1.40.0 zu erstellen. Ohne euch alle hätten wir das nicht geschafft, danke !


Von Übersetzern


Wenn Sie Fragen zur Sprache Rust haben, können diese Ihnen im russischsprachigen Telegramm-Chat oder in einem ähnlichen Chat für Neulinge weiterhelfen.


Dieser Artikel wurde gemeinsam übersetzt von andreevlex , blandger , funkill , Hippolot , P0lunin , PsyHaSTe und LooMaclin .

Source: https://habr.com/ru/post/de481070/


All Articles