*Match
Dieser Abschnitt wird wahrscheinlich nicht gar so lange werden. Match kennt man in anderen Programmiersprachen als eine Art switch > case Anwendung. Wenn ich beides noch besser kennen würde, könnte ich auch die Unterschiede erklären^^
Wozu match?
Match vergleicht eine Variable mit auszuführenden Bedingungen. Sie ist if nicht unähnlich, aber etwas eleganter, wenn es darum geht ein bestimmtes Spektrum an Möglichkeiten abzugreifen. Der Syntax sieht so aus:
let var = x
match var{
opt1 => mach das
opt2 => mach dies
opt3 => mach jenes
.
.
_ => mach das, wenn nichts zu var passt
}
Und gleich ein konkretes Beispiel
fn main (){
let zahl = 2;
match zahl{
1 => println!("Das war die Eins."),
2 => println!("Das war die Zwei."),
3 => println!("Das war die Drei."),
_ => println!("keine Ahnung was du willst."),
}
}
Ausgabe
Obwohl es glaub ich eh nicht so kompliziert ist, ein wenig Erklärung. Die Zahl 2 wird als Variable zahl deklariert. Mit match wird geprüft, was mit zahl passieren soll. 2 entspricht den Anforderungen und das wird auch ausgegeben. Der Unterstrich als letztes Element entspricht dem Defaultwert. Das ist was zutrifft, wenn alles andere schon versagt hat. Als eine Art Fleißaufgabe, mache ich die selbe Funktionalität mit einer if-Anweisung, damit der Unterschied deutlicher erkennbar ist.
let zahl = 2;
if zahl == 1{
println!("Das war die Eins.");
}
else if zahl == 2{
println!("Das war die Zwei.");
}
else if zahl == 3{
println!("Das war die Drei.");
}
else{
println!("keine Ahnung was du willst.");
}
Hat natürlich die selbe Ausgabe wie vorhin. Etwas, das mir auch gerade ein/aufgefallen ist. Die Elemente im Match müssen dem Datentyp der Variable entsprechen, die sie prüfen. Sonst wird der Compiler gaga. Als Beispiel hier ein Stringslice.
let var = "Ich bin ein Stringslice.";
match var{
"Huhu" => println!("Der Text lautet: Huhu."),
"Haha" => println!("Der Text lautet: Haha."),
"Hihi" => println!("Der Text lautet: Hihi."),
_ => println!("Das muss etwas vollkommen anderes sein."),
}
Ausgabe
Match bietet unter anderem auch an, mathematische Operatoren zu verarbeiten.
Dh. ich kann zB bestimmte Bereiche (von - bis) nach Matches überprüfen.
let x = 15;
match x{
1..=10 => println!("Eine Zahl zwischen 1 und 10"),
11..=20 => println!("Eine Zahl zwischen 11 und 20"),
5|10|15|20 => println!("Eines der Zahlen 5,10,15 oder 20"), //wird nicht mehr geprüft
_ => println!("unbekannte Zahl"),
}
Ausgabe
Vielleicht ist euch aufgefallen, dass die 3te Zeile im Match genauso zutreffend ist, allerdings erfüllt die 2te bereits den Zweck und Nr. 3 kommt somit nicht mehr zum tragen. Eines ist mir noch aufgefallen. Die match-Anweisung braucht zwingend die _default Definition. Das unterscheidet sich dann auch vom If. Das else ist optional dort.
Das wars mit der Basis von match. Im Anhang wieder die bekannten Dinge.
Falls ich das noch nicht erwähnt habe, die verschiedenen Anweisungen im Match werden nicht durch ein Semikolon, sondern durch einen Beistrich getrennt.
fn main (){
let zahl = 2;
match zahl{
1 => println!("Das war die Eins."),
2 => println!("Das war die Zwei."),
3 => println!("Das war die Drei."),
_ => println!("keine Ahnung was du willst."),
}
let zahl = 2;
if zahl == 1{
println!("Das war die Eins.");
}
else if zahl == 2{
println!("Das war die Zwei.");
}
else if zahl == 3{
println!("Das war die Drei.");
}
else{
println!("keine Ahnung was du willst.");
}
let var = "Ich bin ein Stringslice.";
match var{
"Huhu" => println!("Der Text lautet: Huhu."),
"Haha" => println!("Der Text lautet: Haha."),
"Hihi" => println!("Der Text lautet: Hihi."),
_ => println!("Das muss etwas vollkommen anderes sein."),
}
let x = 15;
match x{
1..=10 => println!("Eine Zahl zwischen 1 und 10"),
11..=20 => println!("Eine Zahl zwischen 11 und 20"),
5|10|15|20 => println!("Eines der Zahlen 5,10,15 oder 20"), //wird nicht mehr geprüft
_ => println!("unbekannte Zahl"),
}
}
Ausgabe
Vom Editor