Programmiersprache: Rust 1.42 vereinfacht den Vergleich

Die Programmiersprache erweitert match-AusdrĂĽcke fĂĽr Slices und fĂĽhrt ein matches!-Makro ein.

vorlesen Druckansicht 1 Kommentar lesen
Programmiersprache: Rust 1.42 ist vergleichsweise erweitert
Lesezeit: 3 Min.
Inhaltsverzeichnis

Die Rust-Community hat Version 1.42 der von Mozilla initiierten Programmiersprache fertiggestellt. Das aktuelle Release bringt unter anderem detailliertere Fehlermeldungen für unwrap und ähnliche Funktionen. Außerdem lassen sich Vergleiche auch für Teile eines Slice durchführen, und die Programmiersprache erhält das Makro matches!.

Rust gibt konsequenterweise beim Verwenden von unwrap() auf Option::None eine Fehlermeldung aus. Bisher fehlte dabei jedoch der Hinweis auf die Datei und Zeilennummer, in der der Fehler ursprĂĽnglich aufgetreten ist. Stattdessen sahen Entwickler sich mit der wenig hilfreiche Referenz auf die core-Datei mod.rs konfrontiert:

thread 'main' panicked at 'called `Option::unwrap()` \\
on a `None` value', /.../src/libcore/macros/mod.rs:15:40

Dasselbe galt fĂĽr Fehlermeldungen zu unwrap_err, expect und expect_err sowie die entsprechenden Methoden fĂĽr Result. Rust 1.42 gibt stattdessen den deutlich hilfreicheren Hinweis auf die Position des Aufrufs im Quellcode zurĂĽck:

thread 'main' panicked at 'called `Option::unwrap()` \\
on a `None` value', src/main.rs:2:5

Slices sind in Rust Teilbereiche von Elementen wie Strings oder Arrays. Seit Rust 1.26 lassen sie sich in match-Anweisungen verwenden, die mit switch-Anweisungen in C vergleichbar sind. Bisher mussten Entwickler jedoch angeben, welche Slice-Größen sie verarbeiten wollten und im match-Block einen Zweig für unbekannte Größen integrieren.

Rust 1.42 führt ein sogenanntes Rest-Pattern ein: Zwei Punkte .. stehen ähnlich wie ein Wildcard-Zeichen für den Rest des Slice. Das Element darf nicht nur am Ende stehen. Folgendes Beispiel aus dem Rust-Blog zeigt unterschiedliche Vergleiche mit ..:

n foo(words: &[&str]) {
match words {
// Ignore everything but the last element, which must be "!".
[.., "!"] => println!("!!!"),

// `start` is a slice of everything except the last element,
// which must be "z".
[start @ .., "z"] => println!("starts with: {:?}", start),

// `end` is a slice of everything but the first element,
// which must be "a".
["a", end @ ..] => println!("ends with: {:?}", end),

rest => println!("{:?}", rest),
}
}

Eine kleine, nette Ergänzung ist das Marko matches!, das eine Abkürzung für match-Ausdrücke mit einem Zweig für true und einem für false ist. Das Makro erwartet einen Ausdruck und ein Vergleichs-Pattern. Wenn Ersterer zu Letzterem passt, gibt es true zurück, ansonsten false.

Das Pattern darf einige logische Operatoren wie | und AusdrĂĽcke wie if enthalten:

matches!(foo, 'A'..='Z' | 'a'..='z')
matches!(bar, Some(x) if x > 2)

Weitere Neuerungen in Rust 1.42 unter anderem bezüglich der Libraries lassen sich dem Rust-Blog entnehmen. Nennenswert ist noch, dass Error::Description nun offiziell als überholt (deprecated) gilt. Es wird allerdings aufgrund der Stabilitäts-Policy auch in künftigen Versionen nicht aus Rust verschwinden. (rme)