Ferris Talk #1: Iteratoren in Rust

Startschuss der neuen Rust-Kolumne von Rainer Stropek und Stefan Baumgartner: Die erste Ausgabe des ab jetzt monatlichen Ferris Talks stellt die Iteratoren vor.

In Pocket speichern vorlesen Druckansicht 73 Kommentare lesen
Ferris Talk – Neuigkeiten zu Rust. Eine Heise-Kolumne von Rainer Stropek und Stefan Baumgartner für Rustaceans
Lesezeit: 10 Min.
Von
  • Rainer Stropek
Inhaltsverzeichnis

In der ersten Ausgabe unserer Rust-Kolumne erklären wir zunächst für Rust-Einsteiger und -Einsteigerinnen, was Iteratoren in Rust sind und wie sie funktionieren. Anschließend gehen wir der Frage nach, welche Lücken die Rust-Version 1.53 hinsichtlich Iteratoren und Feldern geschlossen hat und warum Entwicklerinnen und Entwickler so lange auf diese scheinbar einfache Sprachfunktion warten mussten. Dabei lässt sich auch über die Sprachprinzipien von Rust einiges lernen.

Ferris Talks – die Kolumne für Rustaceans
Ferris Talk – Neuigkeiten zu Rust. Die neue Kolumne für Rustaceans

Vielfach heißt es, dass sich die Welt im Bereich der Softwareentwicklung schneller ändert als in anderen Bereichen. Auch wenn das stimmen mag, sind fundamentale Umbrüche mit langfristiger Wirkung auch in der Informatik selten. Nicht jedes JavaScript-Framework stellt die Art, Software zu entwickeln, komplett auf den Kopf. Rust aber gehört zu den seltenen Änderungen, die nachhaltig, langfristig und unserer Einschätzung nach positiv wirken werden. In dieser Kolumne möchten wir abwechselnd regelmäßig über Neuerungen und Hintergründe im Bereich Rust berichten. Sie soll Teams, die Rust schon verwenden, helfen, auf dem Laufenden zu bleiben. Einsteigerinnen und Einsteiger sollen durch die Kolumne tiefere Einblicke in die Funktionsweise von Rust erhalten.

Kolumnenautoren vom Rust Meetup Linz

Der Kolumnen-Titel nimmt Bezug auf Ferris, das krabbenförmige inoffizielle Maskottchen der Rust-Gemeinde. Die Ferris Talks schreiben Stropek und Baumgartner ab sofort monatlich und im Wechsel – mehr zu den Autoren steht am Ende des Artikels. Die beiden Kolumnisten sind überzeugte Rustaceans und organisieren das Rust Meetup Linz, die Fachtreffen werden in Videoform festgehalten und sind auf der Rust-Linz-Playliste bei YouTube abrufbar. Wer die beiden beruflich treffen möchte, kann sie unter anderem als Vortragende und als Workshop-Trainer bei der Rust-Konferenz 2021 von Heise erleben.

Rainer Stropek
ist IT-Unternehmer, Softwareentwickler, Trainer, Autor und Vortragender im Microsoft-Umfeld. Er ist seit 2010 MVP für Microsoft Azure und entwickelt mit seinem Team die Zeiterfassung für Dienstleistungsprofis time cockpit.

Stefan Baumgartner
arbeitet bei Dynatrace im österreichischen Linz. In seiner Freizeit organisiert er Stahlstadt.js, ScriptConf, DevOne, Rust Meetup Linz und das legendäre Technologieplauscherl. Wenn noch ein wenig Freizeit bleibt, spricht er beim Working Draft Podcast, genießt italienische Pasta, belgisches Bier und britischen Rock.

Iteratoren sind ein Konzept, das sich in vielen Programmiersprachen findet. C#, Java, JavaScript, C++ bieten Abstraktionen für das Iterator-Konzept, mit denen man im Code die Elemente einer Datenstruktur (etwa einer Liste oder eines Feldes) durchlaufen kann. Darauf aufbauend bringen die Plattformen Mengen- und Aggregationsfunktionen wie das Projizieren, Filtern und Summieren, das Berechnen des Durchschnitts sowie weitere Funktionen mit, die in der Praxis hilfreich sind.

Rust ist keine Ausnahme, im Gegenteil. Iteratoren spielen in der Sprache eine große Rolle. Die zugrundeliegenden Schnittstellen und viele auf ihnen aufbauende Funktionen sind von Haus aus eingebaut. Zusatzbibliotheken wie Itertools fügen weitere hinzu.

Mit Version 1.53 hat Rust diesen Sommer eine wesentliche Erweiterung in Sachen Iteratoren über Felder erhalten: Der IntoIterator-Trait wurde für Felder mit konstanter Größe vollständig implementiert. Damit ziehen Iteratoren für Felder nach und bieten die gleichen Funktionen wie Iteratoren über andere Datentypen wie Vektoren. Damit kann man endlich mit einer for-Schleife über ein Array iterieren, und zwar by Value, nicht nur by Reference. Folgendes Listing zeigt, was seit Rust 1.53 möglich ist:

fn main() {
    // This worked already in Rust < 1.53
    for &number in &[1, 1, 2, 3, 5, 8, 13] {
        println!("The next value is {}", number);
    }

    // This works in Rust >= 1.53
    for number in [1, 1, 2, 3, 5, 8, 13] {
        println!("The next value is {}", number);
    }
}