Das Rust-Entwicklungsteam freut sich, die Veröffentlichung einer neuen Version 1.38.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 haben, müssen Sie zum Aktualisieren auf Version 1.38.0 nur den folgenden Befehl ausführen:
rustup update stable
Wenn Sie rustup noch nicht installiert haben, können Sie es von der entsprechenden Seite unserer Website installieren .
Was ist in der stabilen Version enthalten?
Das Highlight dieser Version ist die Pipeline-Kompilierung.
Pipeline-Kompilierung
Der Compiler benötigt keine vollständig zusammengestellten Abhängigkeiten, um das Paket zu erstellen, sondern nur deren "Metadaten" (Liste der Typen, Abhängigkeiten, Exporte usw.), die in einem frühen Stadium der Kompilierung generiert wurden. Ab Rust 1.38.0 beginnt Cargo sofort mit der Erstellung abhängiger Pakete, sobald deren Metadaten verfügbar sind.
Die Erstellungszeit eines Pakets hat sich nicht verringert, aber unsere Tests haben gezeigt, dass die Kompilierungsgeschwindigkeit bei optimierten Erstellungen (bei denen einige Abhängigkeiten bereits kompiliert wurden) um 10% bis 20% zunimmt. Bei anderen Paketen ist eine starke Erhöhung der Kompilierungsgeschwindigkeit nicht aufgetreten. Die zum Erstellen des Pakets erforderliche Zeit hängt vom Computer ab, sodass die Leistung variieren kann. Die Pipeline-Kompilierung wird ab Version 1.38.0 automatisch aktiviert.
Überprüfung auf Missbrauch von mem::{uninitialized, zeroed}
Wie bereits angekündigt , wird std::mem::uninitialized
nicht empfohlen. Stattdessen sollte MaybeUninit<T>
verwendet werden.
Die Funktion mem::uninitialized
ist noch nicht veraltet, wird jedoch in zukünftigen Versionen durchgeführt. Trotzdem sucht rustc
ab 1.38.0 mit mem::uninitialized
oder mem::zeroed
rustc
nach einer engen Klasse falscher Initialisierungen.
Bei einigen Typen wie &T
und Box<T>
wird ein Nullwert als undefiniertes Verhalten betrachtet, da es sich um zeigerähnliche Objekte handelt, die nicht null
. Es ist ein Fehler, mem::uninitialized
oder mem::zeroed
zum Initialisieren dieser Typen zu verwenden. Der Compiler versucht daher, Sie zu warnen, wenn eine dieser Funktionen zum Initialisieren der oben genannten Objekte verwendet wird, und es spielt keine Rolle, ob sie direkt oder als initialisiert werden Felder mit großer Struktur. Diese Prüfung ist rekursiv, daher enthält der folgende Code eine Warnung:
struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() };
Aufmerksame Leser werden möglicherweise feststellen, dass die Standardbibliothek mehr Typen enthält, die nicht mit Nullen gefüllt werden sollten, insbesondere NonNull<T>
und NonZero<T>
. Bisher wurde die Initialisierung dieser Strukturen mit mem::uninitialized
oder mem::zeroed
nicht verifiziert.
Diese Überprüfungen decken nicht alle Fälle von unsachgemäßer Verwendung von mem::uninitialized
oder mem::zeroed
, sondern ermöglichen es Ihnen, einen garantierten falschen Code zu erkennen, der zu MaybeUninit
wechseln MaybeUninit
.
#[deprecated]
für Makros
Mit dem Attribut #[deprecated]
, das erstmals in Rust 1.9.0 eingeführt wurde, können Paketautoren Benutzer über veraltete Funktionen informieren, die sie in zukünftigen Versionen entfernen möchten. Mit Rust 1.38.0 können Sie dieses Attribut auf Makros anwenden.
std::any::type_name
Beim Debuggen von Code ist möglicherweise eine Zeichenfolgendarstellung des verwendeten Typs erforderlich. Beispielsweise möchten Sie im Hauptteil einer generischen Funktion möglicherweise den Typ des übergebenen Arguments drucken. Dies ist nun mit std::any::type_name
:
fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); }
Ergebnis:
Initializing an instance of i32 Initializing an instance of alloc::string::String
Wie alle Funktionen der Standardbibliothek, die nur zum Debuggen vorgesehen sind, garantiert diese Funktion nicht den genauen Inhalt und das Format der Zeichenfolge. Der Rückgabewert ist die beste Beschreibung des Typs. type_name
Typen können durch denselben type_name
, sie können sich jedoch in zukünftigen Versionen des Compilers ändern.
Änderungen an der Standardbibliothek
Darüber hinaus wurden einige Funktionen stabilisiert:
Andere Änderungen
Die Syntax , der Frachtpaket-Manager und der Clippy-Analysator wurden ebenfalls geändert.
Mitglieder 1.38.0
Viele Leute kamen zusammen, um Rust 1.38.0 zu erstellen. Ohne euch alle hätten wir das nicht geschafft, danke !
Von Übersetzern
Bei Fragen zur Rust-Sprache können sie Ihnen im russischsprachigen Telegramm-Chat oder in einem ähnlichen Chat für Neulinge helfen.
Dieser Artikel wurde gemeinsam von andreevlex , nlinker , funkill und Gymmasssorla übersetzt .