Rust 1.31 und Rust 2018 Release

Das Rust-Entwicklungsteam freut sich, die Veröffentlichung einer neuen Version von Rust, 1.31.0, sowie von "Rust 2018" bekannt zu geben. Rust ist eine Programmiersprache, mit der jeder zuverlässige und effiziente Software erstellen kann.


Wenn Sie eine frühere Version von Rust mit rustup installiert rustup , müssen Sie nur Folgendes tun, um Rust auf Version 1.31.0 zu aktualisieren:


 $ rustup update stable 

Wenn Sie rustup noch nicht installiert rustup , können Sie es von der entsprechenden Seite unserer Website installieren . Detaillierte Versionshinweise für Rust 1.31.0 sind auf GitHub verfügbar.


Was ist in der stabilen Version 1.31.0 enthalten


Rust 1.31 ist wohl die bedeutendste Veröffentlichung seit Rust 1.0! Die erste Iteration von „Rust 2018“ ist in dieser Version enthalten, aber dies ist nicht die einzige Innovation! Die Überprüfung der Verbesserungen wird langwierig sein. Hier ist das Inhaltsverzeichnis:


  • Rost 2018
    • Nicht-lexikalische Lebenszeiten
    • Module Systemänderungen
  • Zusätzliche Regeln für die Anzeige der Lebensdauer
  • const fn
  • Neue Werkzeuge
  • Qualitätsprüfungen des Instrumentalcodes
  • Die Dokumentation
  • Facharbeitsgruppen
  • Neue Website
  • Stabilisierung der Standardbibliothek
  • Frachtverbesserungen
  • Entwickler freigeben

Rost 2018


Wir haben zum ersten Mal im März und dann im Juli über Rust 2018 geschrieben. Einzelheiten dazu, warum Sie Rust 2018 benötigen, finden Sie in diesen Veröffentlichungen. In dieser Rezension gibt es so viel zu erzählen, dass wir uns nur auf das konzentrieren, worum es bei Rust 2018 geht. Sie können es auch in einem Beitrag über Mozilla Hacks ( Übersetzung ) lesen.


Kurz gesagt, Rust 2018 ist eine Gelegenheit, all die Arbeit, die wir in den letzten drei Jahren geleistet haben, in ein zusammenhängendes Ganzes zu integrieren. Rust 2018 ist mehr als nur eine Reihe von Sprachverbesserungen. Zusätzlich zu ihnen enthält es:


  • Toolkit (Unterstützung in IDE, rustfmt , Clippy)
  • Die Dokumentation
  • Facharbeitsgruppen
  • Neue Website

Darüber hinaus werden wir ausführlicher über all dies und über andere Innovationen sprechen.


Erstellen wir mit Cargo ein neues Projekt:


 $ cargo new foo 

Hier ist der Inhalt von Cargo.toml :


 [package] name = "foo" version = "0.1.0" authors = ["Your Name <you@example.com>"] edition = "2018" [dependencies] 

Dem Abschnitt [package] ein neuer Schlüssel hinzugefügt: edition . Bitte beachten Sie, dass es im Jahr 2018 installiert ist. Sie können es auch im Jahr 2015 installieren. Dieser Wert wird standardmäßig festgelegt, wenn der Schlüssel fehlt.


Durch die Verwendung von Rust 2018 werden einige neue Funktionen freigeschaltet, die in Rust 2015 nicht zulässig sind.


Es ist wichtig zu beachten, dass jedes Paket im Modus 2015 oder 2018 sein kann und zusammenarbeitet. Ihr Projekt der Ausgabe 2018 kann die Abhängigkeiten der Ausgabe 2015 verwenden, und das Projekt der Ausgabe 2015 kann die Abhängigkeiten der Ausgabe 2018 verwenden. Dies stellt die Integrität des Ökosystems sicher und stellt sicher, dass alle neuen Funktionen optional sind, während die Kompatibilität mit vorhandenem Code erhalten bleibt. Wenn Sie sich entscheiden, den Rust 2015-Code auf Rust 2018 zu portieren, können Änderungen automatisch über die cargo fix .


Sie fragen sich vielleicht: Was ist mit den neuen Funktionen selbst? Erstens werden sie auch in Rust 2015 hinzugefügt, wenn sie mit den Funktionen dieser Ausgabe kompatibel sind. Daher bleibt der größte Teil der Sprache überall gleich. In der Redaktion finden Sie die Mindestversion von rustc für jede neue Funktion und ihre anderen Anforderungen. Es gibt jedoch einige große Neuerungen, die separat erwähnt werden müssen: nicht lexikalische Lebensdauern und einige Änderungen im Modulsystem.


Nicht-lexikalische Lebenszeiten


Wenn Sie Rust in den letzten Jahren verfolgt haben, können Sie gelegentlich auf den Begriff "NLL" oder "nicht-lexikalische Lebenszeiten" stoßen. Dies ist Jargon, was in einfachen Worten bedeutet: Der Kreditnehmer ist schlauer geworden und akzeptiert jetzt einen korrekten Code, den er zuvor abgelehnt hat. Betrachten Sie ein Beispiel:


 fn main() { let mut x = 5; let y = &x; let z = &mut x; } 

Rust verwendet, um einen Kompilierungsfehler zu werfen:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | 6 | let z = &mut x; | ^ mutable borrow occurs here 7 | } | - immutable borrow ends here 

Dies liegt daran, dass der Lebensbereich von Links "lexikalisch" definiert wurde; Das heißt, das Ausleihen von y wurde als aktiv angesehen, bis y am Ende von main aus dem Gültigkeitsbereich kam, auch wenn wir y nie wieder innerhalb des Gültigkeitsbereichs verwenden. Mit dem obigen Code ist alles in Ordnung, aber der Abhängigkeitsanalysator konnte dies nicht verstehen.


Jetzt wird dieser Code gut kompiliert.


Aber was ist, wenn wir y ? Zum Beispiel so:


 fn main() { let mut x = 5; let y = &x; let z = &mut x; println!("y: {}", y); } 

Rust gab Ihnen diesen Fehler:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | let z = &mut x; | ^ mutable borrow occurs here ... 8 | } | - immutable borrow ends here 

In Rust 2018 wurde diese Fehlermeldung verbessert:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:13 | 4 | let y = &x; | -- immutable borrow occurs here 5 | let z = &mut x; | ^^^^^^ mutable borrow occurs here 6 | 7 | println!("y: {}", y); | - borrow later used here 

Anstatt anzugeben, wo y außerhalb des Gültigkeitsbereichs liegt, wird angezeigt, wo widersprüchliche Ausleihen auftreten. Dies vereinfacht das Debuggen solcher Fehler erheblich.


In Rust 1.31 ist dies eine Verbesserung exklusiv für Rust 2018. Wir planen, sie später zu Rust 2015 hinzuzufügen.


Module Systemänderungen


Das Modulsystem kann für Menschen, die Rust zum ersten Mal lernen, schwierig sein. Natürlich gibt es immer etwas, dessen Beherrschung Zeit braucht. Der Hauptgrund, warum Module für viele so peinlich sind, ist, dass trotz der einfachen und konsistenten Regeln, die das Modulsystem definieren, die Konsequenzen ihrer Verwendung widersprüchlich, mysteriös und unnatürlich erscheinen können.


In der Ausgabe 2018 werden daher einige Änderungen an der Funktionsweise von Pfaden vorgenommen, wodurch das Modulsystem vereinfacht und verständlicher wird.


Hier ist eine kurze Zusammenfassung:


  • extern crate fast nirgendwo anders mehr benötigt.
  • Sie können Makros mithilfe von use importieren, anstatt das Attribut #[macro_use] .
  • Absolute Pfade beginnen mit dem Namen des Containers, wobei sich das Schlüsselwort crate auf den aktuellen Container bezieht.
  • foo.rs und das Unterverzeichnis foo/ können nebeneinander existieren; mod.rs nicht mehr erforderlich, wenn Submodule in einem Unterverzeichnis mod.rs .

Es sieht aus wie ein willkürliches Regelwerk, aber im Allgemeinen wurde das mentale Modell jetzt stark vereinfacht.


Es gibt noch viele Details, alle Details finden Sie im Redaktionshandbuch .


Zusätzliche Regeln für die Anzeige der Lebensdauer


Lassen Sie uns über die in beiden Editionen verfügbaren Verbesserungen sprechen: Wir haben einige zusätzliche Inferenzregeln für impl Blöcke und Funktionsdefinitionen hinzugefügt. Code wie folgt:


 impl<'a> Reader for BufReader<'a> { //   } 

kann jetzt so geschrieben werden:


 impl Reader for BufReader<'_> { //   } 

Lifetime '_ zeigt immer noch, dass BufReader es als Parameter verwendet, aber wir müssen ihm keinen Namen mehr geben.


Lebensdauern müssen noch in Strukturen definiert werden. Wir müssen jedoch nicht mehr so ​​viel Code wie zuvor schreiben:


 // Rust 2015 struct Ref<'a, T: 'a> { field: &'a T } // Rust 2018 struct Ref<'a, T> { field: &'a T } 

Abhängigkeit : 'a wird ausgegeben. Sie können es weiterhin explizit angeben, wenn Sie möchten. Wir erwägen für die Zukunft andere Rückzugsmöglichkeiten an solchen Orten, haben aber bisher keine konkreten Pläne.


const fn


Rust hat mehrere Möglichkeiten, eine Funktion zu deklarieren: fn für gewöhnliche Funktionen, unsafe fn für unsichere Funktionen und externes extern fn für externe Funktionen. Diese Version bietet eine neue Möglichkeit, eine Funktion zu deklarieren: const fn . Es wird so verwendet:


 const fn foo(x: i32) -> i32 { x + 1 } 

Eine konstante Funktion kann als normale Funktion aufgerufen werden, kann aber zusätzlich in jedem konstanten Kontext verwendet werden. Es wird jedoch zur Kompilierungszeit und nicht während der Programmausführung ausgeführt. Zum Beispiel:


 const SIX: i32 = foo(5); 

Die foo Funktion wird zur Kompilierungszeit ausgeführt und SIX wird auf 6 .


Konstante Funktionen können nicht alles, was normale Funktionen können: Sie müssen ein deterministisches Ergebnis haben. Dies ist aus Gründen der Zuverlässigkeit wichtig. In der aktuellen Form können konstante Funktionen eine minimale Teilmenge von Operationen ausführen. Hier sind einige Beispiele dafür, was Sie darin tun können:


  • Verwenden Sie ganzzahlige Arithmetik- und Vergleichsoperationen
  • Verwenden Sie alle logischen Operationen außer && und ||
  • Entwerfen Sie Arrays, Strukturen, Aufzählungen und Tupel
  • Rufen Sie andere konstante Funktionen auf
  • Zugriff per Index in Arrays und Slices
  • Zugriff auf die Felder von Strukturen und Tupeln
  • Verwenden Sie Konstanten (aber keine statischen Werte und nicht einmal Verweise darauf).
  • Verwenden Sie die Links & und *
  • Cast-Typen außer Cast-Raw-Zeiger auf Integer-Wert

Wir werden die Fähigkeiten konstanter Funktionen erweitern, aber der obige Satz reicht bereits aus, um const fn in der Praxis zu verwenden.


Einzelheiten finden Sie im Handbuch .


Neue Werkzeuge


Die Ausgabe 2018 markiert den Beginn eines neuen Reifegrades für das Rust-Tool-Ökosystem. Cargo, Rustdoc und Rustup sind seit Version 1.0 die Hauptwerkzeuge. Mit der Ausgabe 2018 kommt eine neue Generation von Tools, die jetzt jeder nutzen kann: Clippy-, Rustfmt- und IDE-Unterstützung.


Der clippy Static Code Analyzer ist jetzt in stabilem Rust erhältlich. Sie können es über die rustup component add clippy installieren und mit dem cargo clippy . Clippy hat jetzt Version 1.0 erhalten und hat die gleichen Stabilitätsgarantien für statische Prüfungen wie rustc. Neue Schecks können hinzugefügt oder die Funktionalität der alten erweitert werden, aber die alten können nicht gelöscht werden (sie können nur als veraltet markiert werden). Dies bedeutet, dass Code, der mit clippy kompiliert wird, weiterhin mit clippy kompiliert wird (vorausgesetzt, es werden keine Überprüfungen zum Generieren festgelegt
Fehler über deny ), kann aber neue Warnungen erzeugen.


Rustfmt ist ein Tool zum Formatieren von Code in Rust. Durch die automatische Code-Formatierung sparen Sie Zeit und bringen Ihren Code dem offiziellen Rust-Stil näher. Sie können es über die rustup component add rustfmt installieren und den Befehl rustup component add rustfmt cargo fmt .


Die aktuelle Version enthält Rustfmt 1.0. Von nun an garantieren wir die Abwärtskompatibilität für Rustfmt: Wenn Sie Ihren Code heute formatieren, wird sich die Formatierung in Zukunft nicht ändern (nur für Standardparameter). Abwärtskompatibilität bedeutet, dass es jetzt praktisch ist, Rustfmt auf Ihrem CI auszuführen (verwenden Sie cargo fmt --check ). Versuchen Sie dies zusammen mit "Formatieren beim Speichern" im Editor, und Ihr Workflow wird revolutioniert.


IDE-Unterstützung ist eine der am häufigsten nachgefragten Funktionen für Rust. Jetzt gibt es mehrere hochwertige Lösungen:



Die Supportarbeiten in der IDE sind noch nicht abgeschlossen. Insbesondere die Code-Vervollständigung in RLS-basierten Editoren ist nicht auf dem neuesten Stand. Wenn Sie jedoch hauptsächlich Unterstützung für Typen, Dokumentation und den "Übergang zur Definition" wünschen, sind Sie zufrieden.


Qualitätsprüfungen des Instrumentalcodes (Werkzeuglinien)


In Rust 1.30 haben wir "instrumentelle Attribute" wie #[rustfmt::skip] stabilisiert. In Rust 1.31 haben wir so etwas stabilisiert: "Werkzeuglinien" wie #[allow(clippy::bool_comparison)] . Auf diese Weise können Sie Namespaces für Überprüfungen angeben, um klarer zu machen, von welchen Tools sie stammen.


Wenn Sie zuvor Clippy-Prüfungen verwendet haben, können Sie wie folgt migrieren:


 //  #![cfg_attr(feature = "cargo-clippy", allow(bool_comparison))] //  #![allow(clippy::bool_comparison)] 

Sie brauchen cfg_attr nicht mehr! Sie erhalten jetzt auch Warnungen, mit denen Sie zur Verwendung des neuen Stils wechseln können.


Die Dokumentation


In diesem Jahr wurden einige Verbesserungen an Rustdoc vorgenommen, und das vollständig neu geschriebene Buch The Rust Programming Language wurde veröffentlicht. Sie können eine Papierkopie bei No Starch Press kaufen!


Früher wurde es die „zweite Ausgabe“ des Buches genannt, aber da es die erste gedruckte Ausgabe wurde, sorgte dies für Verwirrung. Schließlich soll die Printausgabe regelmäßig aktualisiert werden. Am Ende wurde nach vielen Diskussionen mit No Starch beschlossen, das Buch auf der Website mit jeder Veröffentlichung zu aktualisieren, und No Starch nahm die Änderungen regelmäßig auf und druckte sie aus. Das Buch verkauft sich ziemlich gut und bringt Geld für den Black Girls Code ein .


Die neue Version des Buches finden Sie hier .


Facharbeitsgruppen


In diesem Jahr haben wir die Schaffung von vier Arbeitsgruppen angekündigt:


  • Netzwerkdienste
  • Befehlszeilenanwendungen
  • Webassembly
  • Eingebettete Geräte

Die Gruppen haben sehr hart gearbeitet, um Rust in jedem dieser Bereiche besser zu machen. Hier sind einige Erfolge:


  • Die Netzwerkdienste haben die Schnittstelle für Futures neu gestaltet und zusätzlich async / await. Diese Verbesserungen wurden noch nicht veröffentlicht, aber wir sind schon nah dran!
  • Das CLI-Team arbeitete an Bibliotheken und Dokumentationen, um Befehlszeilenanwendungen zu verbessern.
  • WebAssembly hat viele erstklassige Tools für die Verwendung von Rust mit wasm veröffentlicht.
  • Für eingebettete Geräte wurde es möglich, ARM auf einem stabilen Rust!

Mehr dazu erfahren Sie auf unserer neuen Seite!


Neue Website


Letzte Woche haben wir eine neue Version unserer Website angekündigt. Jetzt ist es die offizielle Version von rust-lang.org geworden!


Um es zu schaffen, brauchten viele Menschen ein Jahr Arbeit. Obwohl vor seiner Fertigstellung noch viel zu tun ist, sind wir stolz auf die geleistete Arbeit.


Stabilisierung der Standardbibliothek


Neue From Implementierungen wurden hinzugefügt:


  • u8 implementiert jetzt From<NonZeroU8> , ähnlich für andere numerische Typen und deren NonZero Äquivalente
  • Option<&T> implementiert From<&Option<T>> ähnlich wie &mut

Folgende Funktionen wurden ebenfalls stabilisiert:



Weitere Informationen finden Sie in den Versionshinweisen.


Frachtverbesserungen


Cargo lädt jetzt Pakete parallel über HTTP / 2.


Da die extern crate jetzt optional ist, wäre es außerdem frustrierend, die extern crate foo as bar; zu schreiben extern crate foo as bar; um die Abhängigkeit umzubenennen. Daher können Sie dies in Cargo.toml tun:


 [dependencies] baz = { version = "0.1", package = "foo" } 

oder gleichwertig:


 [dependencies.baz] version = "0.1" package = "foo" 

Das foo Paket ist jetzt als baz zur Verwendung in Ihrem Code verfügbar.


Weitere Informationen finden Sie in den Versionshinweisen.


Entwickler 1.31.0


Normalerweise danken wir am Ende der Überprüfung den Personen, die zur Veröffentlichung beigetragen haben . Aber diesmal deckt diese Liste im Gegensatz zur Vergangenheit nicht alle Personen, die geholfen haben, und den gesamten Arbeitsaufwand vollständig ab. Jede reguläre Veröffentlichung ist das Ergebnis von sechs Wochen Arbeit, aber diese Veröffentlichung ist der Höhepunkt von drei Jahren Bemühungen, die sich in der Vielzahl von Repositories widerspiegeln, die von einer großen Anzahl von Menschen erstellt wurden. Wir haben uns gefreut, mit Ihnen allen zusammenzuarbeiten, und freuen uns auf die weitere Entwicklung von Rust in den nächsten drei Jahren.


Von einem Übersetzer: Ich danke den Mitgliedern der Rustycrate-Community und persönlich @dashadee , ozkriff , humbug und mvlabat für ihre Hilfe bei der Übersetzung und beim Korrekturlesen.

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


All Articles