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:
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 => { }
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 => { } _ => { }
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]
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:
todo!()
Eine kürzere, einprägsamere und bequemere Version des Makros, die nicht unimplemented!()
.
slice::repeat
Erstellt ein Vec<T>
aus n
Slice-Wiederholungen.
mem::take
Diese Funktion übernimmt die Werte aus der veränderlichen Verknüpfung und ersetzt sie durch den Standardwert für diesen Typ. Es ähnelt Option::take
und Cell::take
und ist eine praktische Abkürzung für mem::replace(&mut dst, Default::default())
.
BTreeMap::get_key_value
und HashMap::get_key_value
Gibt ein Schlüssel-Wert-Paar zurück, das mit dem angegebenen Schlüssel übereinstimmt.
Option::as_deref
, Option::as_deref_mut
Sie funktionieren ähnlich wie Option::as_ref
und Option::as_mut
, verwenden jedoch Deref
bzw. DerefMut
sodass opt_box.as_deref()
und opt_box.as_deref_mut()
, wobei opt_box: Option<Box<T>>
, Option<&T>
erstellen Option<&T>
und Option<&mut T>
.
Option::flatten
Diese Funktion erweitert wie Iterator::flatten
Option<Option<T>>
zu Option<T>
und erzeugt Some(x)
für Some(Some(x))
und None
andernfalls.
UdpSocket::peer_addr
Gibt die Adresse des Remote-Hosts zurück, mit dem der Socket verbunden ist.
{f32,f64}::to_be_bytes
, {f32,f64}::to_le_bytes
, {f32,f64}::to_ne_bytes
, {f32,f64}::from_be_bytes
, {f32,f64}::from_le_bytes
und {f32,f64}::from_ne_bytes
Gibt eine Speicherdarstellung von Gleitkommazahlen als Array von Bytes mit Big-Endian- (Netzwerk-), Little-Endian- oder Native-Endian-Bytereihenfolge zurück.
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 .