rust-analyzer in rustup, IntoFuture, ffi-Typen in core und alloc, Verbesserungen in Cargo / Sudo Null IT News

Das Rust-Team freut sich, eine neue Version der Sprache anzukündigen – 1.64.0. Rust ist eine Programmiersprache, die es jedem ermöglicht, zuverlässige und effiziente Software zu erstellen.

Wenn Sie eine frühere Version von Rust über Rustup installiert haben, müssen Sie zum Upgrade auf Version 1.64.0 nur den folgenden Befehl ausführen:

Rustup-Update stabil

Wenn Sie Rustup noch nicht haben, können Sie es mit installieren Seiten auf unserer Website sowie detaillierte Versionshinweise für 1.64.0 auf GitHub.

Wenn Sie uns beim Testen zukünftiger Versionen helfen möchten, können Sie den Kanal Beta (rustup default beta) oder nightly (rustup default nightly) verwenden. Bitte, Bericht über alle Fehler, auf die Sie gestoßen sind.

Was ist in 1.64.0 stabilisiert

Verbesserung von .await mit IntoFuture

Trait in Rust 1.64 stabilisiert In die Zukunft. Er sieht aus wie ein Charakterzug In Iterator, aber anstatt for … in … Schleifen zu unterstützen, ändert IntoFuture das Verhalten von .await. Mit IntoFuture kann das Schlüsselwort .await nicht nur auf Futures, sondern auch auf verwendet werden alles, was mit IntoFuture in eine Zukunft umgewandelt werden kannwodurch Ihre API benutzerfreundlicher wird!

Nehmen wir zum Beispiel einen Builder, der eine Anfrage an einen Netzwerkspeicher erstellt:

pub struct Fehler { … } pub struct StorageResponse { … }: pub struct StorageRequest (bool); impl StorageRequest { /// Erstellen Sie eine neue Instanz von `StorageRequest`. pub fn new() -> Self { … } /// Entscheiden, ob der Debug-Modus aktiviert ist. pub fn set_debug(self, b: bool) -> Self { … } /// Anfrage senden und Antwort erhalten. pub async fn send(self) -> Ergebnis { … } }

Eine typische Verwendung würde wahrscheinlich so aussehen:

let response = StorageRequest::new() // 1. Instantiiere .set_debug(true) // 2. Setze einige .send() Einstellungen // 3. Konstruiere Future .await?; // 4. Führen Sie Future + Forward-Fehler aus

Das ist nicht schlecht, aber wir können es besser machen. Mit IntoFuture können wir dies in einem Schritt tun „Zukunft gestalten“ (Zeile 3) und “zukünftiger Start” (Zeile 4):

let response = StorageRequest::new() // 1. Instanziiere .set_debug(true) // 2. Setze einige Optionen .await?; // 3. Konstruieren + Future ausführen + Fehler werfen

Wir können dies tun, indem wir ein IntoFuture für die StorageRequest implementieren. IntoFuture erfordert, dass wir eine benannte Zukunft haben, die wir zurückgeben. Wir können es gepackt erstellen und einen Alias ​​dafür deklarieren:

// Zuerst müssen wir einige neue Typen in den Geltungsbereich importieren. benutze std::pin::Pin; benutze std::future::{Future, IntoFuture}; pub struct Error { … } pub struct StorageResponse { … } pub struct StorageRequest (bool); impl StorageRequest { /// Erstellen Sie eine neue Instanz von `StorageRequest`. pub fn new() -> Self { … } /// Entscheiden Sie, ob der Debug-Modus aktiviert werden soll. pub fn set_debug(self, b: bool) -> Self { … } /// Anfrage senden und Antwort erhalten pub async fn send(self) -> Result { … } } // New implementierung // 1. Erstellen Sie einen neuen benannten Future-Typ // 2. Implementieren Sie `IntoFuture` für den Pub-Typ `StorageRequest` StorageRequestFuture = Pin + Send + ‘static>> impl IntoFuture für StorageRequest { type IntoFuture = StorageRequestFuture; Typ Output = ::Output; fn into_future(self) -> Self::IntoFuture {Box::pin(self.send()) } }

Dies erfordert etwas mehr Code für die Implementierung, bietet jedoch eine einfachere API für Benutzer.

Wir hoffen, dass es die Rust Async WG in Zukunft einfacher machen wird, eine neue benannte Zukunft mit zu erstellen impl Trait to type (“Type Alias ​​Impl Trait” oder TAIT). Dies sollte die Implementierung von IntoFuture erleichtern, indem die Alias-Signatur vereinfacht und die Leistung verbessert wird, indem die Box aus dem Alias ​​entfernt wird.

C-kompatible FFI-Typen in Core und Alloc

Durch Aufrufen oder Aufrufen durch die C ABI kann Rust-Code Typaliase wie c_uint oder c_ulong verwenden, um die entsprechenden Typen von C auf jeder Zielassembly abzugleichen, ohne dass ein spezieller Code oder spezielle Bedingungen erforderlich sind.

Zuvor waren diese Typaliase nur in std verfügbar, sodass Code, der für eingebettete Systeme geschrieben wurde, und andere Skripte, die nur core oder alloc verwenden konnten, diese Typen nicht verwenden konnten.

Rust 1.64 stellt jetzt alle Aliase vom Typ c_* bereit core::ffiund auch core::ffi::CStr mit C-Saiten zu arbeiten, bietet auch Rust 1.64 alloc::ffi::CString mit nativen C-Strings zu arbeiten, indem nur die alloc-Kiste verwendet wird, nicht die vollständige std-Bibliothek.

Rust-Analyzer ist jetzt über Rustup verfügbar

Rostanalysator ist jetzt Teil des in Rust enthaltenen Toolsets. Dies erleichtert das Herunterladen und den Zugriff auf Rust-Analyzer und macht es auf mehr Plattformen verfügbar. Es ist erhältlich als Rustup-Komponentedie installiert werden kann mit:

rustup-Komponente fügt rust-analyzer hinzu

Um die von Rustup installierte Version auszuführen, müssen Sie sie derzeit wie folgt aufrufen:

rustup Run Stable Rost-Analysator

In einer zukünftigen Version wird rustup einen integrierten Proxy bereitstellen, sodass beim Ausführen der ausführbaren Datei rust-analyzer die entsprechende Version ausgeführt wird.

Die meisten Benutzer sollten weiterhin die vom Rust-Analyzer-Team bereitgestellten Releases verwenden, die häufiger veröffentlicht werden. Sie sind auf verfügbar Rost-Analyzer-Release-Seite. Benutzer sind davon nicht betroffen. offizielle VSCode-Erweiterungweil es automatisch Releases im Hintergrund herunterlädt und aktualisiert.

Cargo-Verbesserungen: Workspace-Vererbung und Mehrzweck-Builds

Wenn Sie jetzt mit Sammlungen verwandter Bibliotheken oder Binär-Crates im selben Cargo-Arbeitsbereich arbeiten, können Sie vermeiden, gemeinsame Feldwerte zwischen Crates zu duplizieren, wie z. B. gemeinsame Versionsnummern, Repository-URLs oder Rust-Version. Es hilft auch, diese Werte zwischen Crates synchron zu halten, wenn sie aktualisiert werden. Weitere Informationen finden Sie unter Arbeitsbereich.Paket, workspace.dependencies und “Workspace-Abhängigkeitsvererbung”.

Wenn Sie für mehrere Ziele bauen, können Sie mehrere –target-Optionen an Cargo Build übergeben, um sie alle auf einmal zu bauen. Sie können auch für installieren build.target Multi-Target-Array in .cargo/config.toml standardmäßig auf Multi-Target-Builds.

Stabilisierte APIs

Die folgenden Trait-Methoden und -Implementierungen wurden stabilisiert:

Typen, die zuvor in std::ffi stabilisiert wurden und jetzt in core und alloc verfügbar sind:

Typen, die zuvor in std::os::raw stabilisiert wurden und jetzt in core::ffi und std::ffi verfügbar sind:

Mehrere Hilfsfunktionen, die mit Poll, einer Low-Level-Futures-Implementierung, verwendet werden, wurden stabilisiert:

Wir hoffen, in Zukunft eine einfachere API anbieten zu können, die weniger Low-Level-Details wie Poll und Pin erfordert. Aber vorerst erleichtern diese Hilfsfunktionen das Schreiben eines solchen Codes.

Die folgenden APIs können jetzt in einem konstanten Kontext verwendet werden:

Kompatibilitätshinweise

  • Wie es war zuvor angekündigt, erfordert das Kompilieren von Linux-Zielen einen Linux 3.2-Kernel oder höher (mit Ausnahme der Ziele, die bereits einen neueren Kernel erfordern). Auch die linux-gnu-Ziele erfordern jetzt glibc 2.17 (außer denen, die bereits die neuere glibc benötigen).
  • Rust 1.64.0 ändert das Speicherlayout von Ipv4Addr, Ipv6Addr, SocketAddrV4 und SocketAddrV6, um kompakter und effizienter zu sein. Diese interne Darstellung wurde nie erweitert, aber einige Crates verließen sich immer noch darauf, indem sie std::mem::transmute verwendeten, was zu ungültigen Speicherzugriffen führte. Solche internen Implementierungsdetails der Standardbibliothek niemals nicht gelten als stabile Schnittstelle. Um den Schaden zu begrenzen, haben wir mit den Autoren aller noch unterstützten Kisten zusammengearbeitet, um behobene Versionen zu veröffentlichen, die seit über einem Jahr auf dem Markt sind. Die überwiegende Mehrheit der betroffenen Benutzer wird in der Lage sein, die Auswirkungen mit einem Cargo-Update abzumildern.
  • Im Rahmen Einstellung der RLS-Unterstützung es ist auch die letzte Veröffentlichung, die eine Kopie des RLS enthält. Ab Rust 1.65.0 wird RLS durch einen kleinen LSP-Server ersetzt, der eine Verfallswarnung anzeigt.

Andere Änderungen

Die Version Rust 1.64 enthält weitere Änderungen:

  • Der Rust-Compiler für Windows wird jetzt mit PGO erstellt, was eine Leistungssteigerung von 10-20 % beim Kompilieren von Code ermöglicht.
  • Wenn Sie eine Struktur deklariert haben, die ein Feld enthält, das nie verwendet wird, dann hat rustc davor gewarnt. Sie können jetzt die Prüfung „unused_tuple_struct_fields“ aktivieren, um eine ähnliche Warnung zu nicht verwendeten Feldern in Tupelstrukturen zu erhalten. In zukünftigen Versionen planen wir, diese Prüfung standardmäßig zu aktivieren. Für Felder vom Einzeltyp (()) wird keine solche Warnung generiert, um die Migration von vorhandenem Code zu erleichtern, ohne die Tupelindizes zu ändern.

Überprüfen Sie alles, was sich geändert hat Rost, Ladung und knackig.

Mitglieder 1.64.0

Viele Leute haben sich zusammengeschlossen, um Rust 1.64.0 zu erstellen. Ohne euch hätten wir es nicht geschafft. Vielen Dank!

Von Übersetzern

Bei Fragen zur Rust-Sprache können wir Ihnen weiterhelfen Telegram-Chat in russischer Sprache oder in ähnlicher Weise Chat für Anfängerfragen. Wenn Sie Fragen zu Übersetzungen haben oder dabei helfen möchten, wenden Sie sich bitte an Übersetzer chatten.

Dieser Artikel wurde gemeinsam von andreevlex TelegaOvoshey und funkill übersetzt.

Similar Posts

Leave a Reply

Your email address will not be published.