Neuer Milestone von Rust: Version 1.75 mit asynchronen Trait-Funktionen

In Rust gibt es nun in Traits asynchrone Funktionen und "impl Trait" als Rückgabetyp. Das Rust-Team nennt es eine Milestone-Version.

In Pocket speichern vorlesen Druckansicht 44 Kommentare lesen
Cyberkrimineller bei der Arbeit

(Bild: Tero Vesalainen/Shutterstock.com)

Lesezeit: 1 Min.

Kurz vor dem Jahreswechsel hat das Rust-Team die Milestone-Version 1.75 veröffentlicht. Wie wenige Tage davor im Blog schon angekündigt, unterstützt die Programmiersprache nun in Traits asynchrone Funktionen, also async fn, und impl Trait als Rückgabetyp. Das Team geht davon aus, dass es vielen Anwendern "in den Fingern juckt, dies in ihrem eigenen Code auszuprobieren."

Bereits Version 1.26 von Rust führte impl Traits als Rückgabetyp von Funktionen ein. Der Typ selbst ist an dieser Stelle unbekannt, implementiert aber einen Trait, was für Closures, Iterators und andere komplexe Typen verwendet wird. Ein Beispiel eines Iterators aus dem erwähnten Blogeintrag:

/// Given a list of players, return an iterator
/// over their names.
fn player_names(
    players: &[Player]
) -> impl Iterator<Item = &String> {
    players
        .iter()
        .map(|p| &p.name)
}

Dies ist nun auch in Traits möglich:

trait Container {
    fn items(&self) -> impl Iterator<Item = Widget>;
}

impl Container for MyContainer {
    fn items(&self) -> impl Iterator<Item = Widget> {
        self.items.iter().cloned()
    }
}

Und ebenso erlaubt Rust nun die lang erwarteten asynchronen Funktionen async fn in Traits (hier eine HTTP-Anfrage):

trait HttpService {
    async fn fetch(&self, url: Url) -> HtmlBody;
//  ^^^^^^^^ desugars to:
//  fn fetch(&self, url: Url) -> impl Future<Output = HtmlBody>;
}

Es gibt jedoch noch Einschränkungen in der Verwendung: Beides lässt sich nicht ohne Weiteres in public Traits einsetzen. Ebenso sind dynamische Bindungen nicht möglich. Details finden sich im genannten Blogbeitrag.

Weitere Neuerungen in Version 1.75 betreffen Pointer, den Compiler rustc und neue stabile APIs. Ein Update erfolgt am einfachsten via rustup:

rustup update stable

Für mutigere Programmiererinnen und Tester gibt es einen Beta- und einen Nigthly-Channel:

rustup default beta
rustup default nightly

Bugs lassen sich im Repository des Projekts melden.

(who)