Ich präsentiere Ihnen eine Übersetzung der Veröffentlichung zur neuen Version der beliebtesten Programmiersprache Rust .
Einführung
Das Team der Programmiersprache Rust freut sich, eine neue Version 1.36.0 bekannt zu geben. Rust ist eine Programmiersprache, mit der jeder zuverlässige und schnelle Software entwickeln kann.
Wenn Sie die vorherige Version von Rust mit rustup
installiert rustup
, ist es nicht schwierig, die aktuelle Version zu erhalten:
$ rustup update stable
Wenn Sie immer noch kein rustup
, können Sie es von der entsprechenden Seite auf unserer Website erhalten. Eine ausführliche Rezension dieser Version ist auf GitHub verfügbar.
Was ist in der stabilen Version enthalten?
Diese Version hat viele Änderungen vorgenommen, einschließlich der Stabilisierung des lang erwarteten Future
Merkmals, der Zuweisungskiste, der MaybeUninit<T>
-Struktur, der NLL Rust 2015
, einer neuen Implementierung von HashMap<K, V>
und der Unterstützung der --offline
Flagge in Cargo.
Die wichtigsten Änderungen werden im Folgenden beschrieben. Sie können jedoch auch eine detaillierte Liste der Innovationen anzeigen, um zusätzliche Aufmerksamkeit zu erlangen.
Zukünftige Stabilisierung
Rust 1.36.0 stabilisierte das lang erwartete Future
!
Wir hoffen, dass diese Innovation es populären Kisten, Bibliotheken und dem gesamten Ökosystem ermöglicht, sich auf die async
/ .await
vorzubereiten, die in naher Zukunft stabilisiert werden soll.
Rack-Stabilisierung verteilen
Vor Version 1.36.0 bestand die Standardbibliothek aus Standard-, core
und proc_macro
. Die core
hatte grundlegende Funktionen (wie Iterator
und Copy
) und konnte in Umgebungen mit #![no_std]
, da keine Anforderungen gestellt wurden. In der Zwischenzeit lieferte die std
Typen wie Box<T>
sowie die Funktionalität des Betriebssystems (globaler Allokator).
Ab Rust 1.36.0 sind jetzt Komponenten der Standardkiste, abhängig vom globalen Allokator, z. B. Vec<T>
, in der Allokationskiste verfügbar. Die std
exportiert diese Komponenten inzwischen wieder.
Während #![no_std]
die die alloc
weiterhin den nightly
Kanal benötigen, können C #![no_std]
die alloc
in stabilem Rust verwenden.
Wir stellen außerdem fest, dass alle "regulären" Programme (ohne #![no_std]
) in ihren Abhängigkeiten die oben mit #![no_std]
beschriebenen Bibliotheken enthalten können. Wir hoffen, dass dies dazu beitragen wird, ein Ökosystem zu entwickeln, das mit #![no_std]
kompatibel ist.
Wenn Sie Entwickler einer Bibliothek sind, für deren Funktion Zuordnungsprimitive erforderlich sind, empfehlen wir, Ihre Bibliothek mit der folgenden Syntax am Anfang der lib.rs
Datei als kompatibel mit #![no_std]
lib.rs
:
#![no_std] extern crate alloc; use alloc::vec::Vec;
VielleichtUninit place mem :: uninitialized
In früheren Versionen von Rust konnten Sie mit der Funktion mem::uninitialized
die Initialisierungsprüfungen abbrechen, da Sie bereits BEREITS auf Typ T
initialisiert wurden, ohne etwas zu tun. Eine der Anwendungen dieser Funktion war die "faule" Zuweisung von Arrays.
mem::uninitalized
ist jedoch eine übermäßig gefährliche Operation, die mit dem Rust-Compiler nicht korrekt verwendet werden kann, vorausgesetzt, alle Werte werden ordnungsgemäß initialisiert.
Zum Beispiel führt der Aufruf von mem::uninitialized::<bool>()
sofort zu undefiniertem Verhalten , da aus Sicht von Rust nicht initialisierte Bits entweder Null ( false
) oder Eins ( true
) sind und nur zwei der oben genannten Muster für den bool
Typ geeignet sind .
Um diese Situation zu beheben, wurde der Typ MaybeUninit<T>
in Rust 1.36.0 stabilisiert . Der Rust-Compiler geht nicht mehr davon aus, dass MaybeUninit<T>
ein initialisierter Typ von T
Auf diese Weise können Sie die schrittweise Initialisierung sicherer durchführen und schließlich .assume_init()
wenn Sie sicher sind, dass maybe_t: MaybeUninit<T>
den initialisierten Typ maybe_t: MaybeUninit<T>
enthält T
Da MaybeUninit<T>
ab Rust 1.38 eine sicherere Alternative ist, wird die Funktion mem::uninitialized
als veraltet markiert.
Um mehr über das nicht initialisierte Gedächtnis, mem::uninitialized
und MaybeUninit<T>
zu erfahren, lesen Sie den Artikel von Alexis Bessessner . Die Standardbibliothek enthält auch eine ausreichende Dokumentation zu MaybeUninit<T>
.
NLL für Rust 2015
In der Ankündigung von Rust 1.31.0 haben wir Ihnen von NLL (Non- Lexical Life Timelines) berichtet, einer Innovation in der Sprache, die den Link Controller (Leihprüfer) intelligenter und freundlicher macht. Zum Beispiel können Sie jetzt so schreiben:
fn main() { let mut x = 5; let y = &x; let z = &mut x;
Bei 1.31.0 wurde die NLL nur für Rust 2018 stabilisiert, und es wurde angenommen, dass wir sie in Zukunft auf Rust 2015 übertragen würden. Dies wurde in Rust 1.36.0 durchgeführt, NLL wurde für Rust 2015 verfügbar.
Da NLL in beiden Versionen unterstützt wird, nähern wir uns der Entfernung des alten Link-Controllers. Der alte Link-Controller hat jedoch leider falschen Code akzeptiert, den er NICHT hätte akzeptieren dürfen.
Infolgedessen befindet sich NLL jetzt in der Migrationsphase, in der anstelle von Fehlern Warnungen ausgegeben werden, wenn der NLL-Verbindungscontroller keinen Code genehmigt, der den alten AST- basierten Verbindungscontroller genehmigt. Wir empfehlen Ihnen, sich die Liste der betroffenen öffentlichen Kisten anzusehen.
Lesen Sie den Artikel von Felix Klok, um mehr über NLL, MIR, das Beheben verwandter Integritätsprobleme und die Vorgehensweise bei angezeigten Compiler-Warnungen zu erfahren.
Neue HashMap-Implementierung
In Rust 1.36.0 wurde die vorherige Implementierung von HashMap<K, V>
durch eine Hashbrown- hashbrown
die auf dem SwissTable- Design basiert. Die Schnittstelle bleibt gleich, aber die aktuelle Implementierung ist im Durchschnitt schneller und verbraucht weniger Speicher. Beachten Sie jedoch, dass die Standardimplementierung weiterhin den SipHash 1-3- Algorithmus verwendet.
- Offline-Support in Cargo
Während der meisten Builds verwendet Cargo Ihr Netzwerk nicht. An einigen Stellen, z. B. wenn eine neue Abhängigkeit hinzugefügt wurde, versucht Cargo jedoch weiterhin, auf das Netzwerk zuzugreifen. Manchmal ist dieses Verhalten nicht akzeptabel (in einem isolierten System oder in einem Flugzeug).
Rust 1.36.0 hat die neue Flagge - --offline
stabilisiert. Dieses Flag überschreibt den Algorithmus zur Auflösung von Abhängigkeiten und verwendet stattdessen lokal zwischengespeicherte Abhängigkeiten.
Wenn die angeforderten Kisten ohne ein getrenntes Netzwerk nicht verfügbar sind, wird Cargo mit einem Fehler beendet. Verwenden Sie den Befehl cargo fetch
, mit dem alle erforderlichen Abhängigkeiten für ein bestimmtes Projekt cargo fetch
, cargo fetch
den lokalen Cache vor dem Verlassen des Netzwerks vorab zu cargo fetch
.
Lesen Sie den Artikel von Nick Cameron, um mehr über --offline
und cargo fetch
zu erfahren. Weitere Änderungen an Cargo werden hier ausführlich beschrieben.
Bibliotheksänderungen
Makro dbg!
begann mehrere Argumente zu unterstützen;
Einige Methoden sind konstant geworden:
Einige APIs sind stabilisiert, darunter:
Andere Änderungen
Detaillierte Änderungsbeschreibungen in Version 1.36.0 sind für Rust , die Standardbibliothek , Cargo und Clippy verfügbar .
Mitglieder 1.36.0
Viele Leute kamen zusammen, um Rust 1.36.0 zu erstellen. Ohne euch alle hätten wir das nicht geschafft, danke !
Vom Übersetzer
Bei Fragen zur Rust-Sprache können sie Ihnen im russischsprachigen Telegramm-Chat oder in einem ähnlichen Chat für Neulinge helfen.