Booleans in Rust
Ein Boolean ist der einfachste Typ überhaupt: Er kann nur true (wahr) oder false (falsch) sein. In Rust heißt er bool, und du brauchst ihn überall dort, wo dein Code eine Entscheidung treffen muss.
Einen Boolean deklarieren
Abschnitt betitelt „Einen Boolean deklarieren“fn main() { let is_active = true; let has_error: bool = false; println!("aktiv: {is_active}, Fehler: {has_error}");}Rust erkennt bool bei true/false fast immer selbst. Den Typ musst du also nur selten ausschreiben.
Booleans entstehen meistens durch Vergleiche
Abschnitt betitelt „Booleans entstehen meistens durch Vergleiche“In echtem Code schreibst du true oder false selten direkt hin. Meistens entstehen sie, wenn du etwas vergleichst:
fn main() { let age = 20; let can_vote = age >= 18; println!("Darf wählen: {can_vote}");}Ausgabe:
Darf wählen: trueBooleans in Bedingungen
Abschnitt betitelt „Booleans in Bedingungen“Die Hauptaufgabe eines bool ist es zu entscheiden, welcher Zweig eines if ausgeführt wird:
fn main() { let is_raining = true;
if is_raining { println!("Nimm einen Regenschirm mit"); } else { println!("Lass ihn zu Hause"); }}if behandeln wir ausführlich auf der Seite If…Else. Das hier ist nur ein Vorgeschmack, warum Booleans so wichtig sind.
Booleans kombinieren und Kurzschlussauswertung
Abschnitt betitelt „Booleans kombinieren und Kurzschlussauswertung“&& (und), || (oder) und ! (nicht) kennst du schon von der Seite Operatoren. Eine Sache solltest du darüber aber noch wissen: Sie hören früh auf, sobald das Ergebnis feststeht. Das nennt man Kurzschlussauswertung (Short-Circuit Evaluation).
- Bei
a && b: Istagleichfalse, muss das Ganzefalsesein. Rust schaut sichbalso gar nicht mehr an. - Bei
a || b: Istagleichtrue, muss das Ganzetruesein. Rust schaut sichbalso gar nicht mehr an.
Das ist mehr als ein Trick für mehr Tempo. Die linke Seite kann so die rechte Seite schützen:
fn main() { let count = 0; let total = 50;
// count ist 0, also hört Rust nach `count != 0` auf und teilt nie. let big_average = count != 0 && total / count > 10; println!("großer Durchschnitt: {big_average}");
let is_weekend = true; let has_homework = true; // is_weekend ist true, also wird `!has_homework` nie geprüft. let can_relax = is_weekend || !has_homework; println!("kann entspannen: {can_relax}");}Ausgabe:
großer Durchschnitt: falsekann entspannen: trueEine Division durch null würde das Programm abstürzen lassen. Weil count != 0 zuerst kommt und false ist, wird die Division einfach nie ausgeführt. Vertauschst du die beiden Seiten (total / count > 10 && count != 0), käme die Division zuerst. Hier erkennt das sogar der Compiler und weigert sich, das Programm zu bauen („this operation will panic at runtime“, also: Diese Operation löst zur Laufzeit eine Panic aus). Bei einem Wert, der erst während des Programms ankommt, würde es stattdessen abstürzen. Setz die „Sicherheitsprüfung“ deshalb nach links.
Übungen
Abschnitt betitelt „Übungen“1. Darf das Kind mitfahren?
Abschnitt betitelt „1. Darf das Kind mitfahren?“Bei einem Fahrgeschäft im Freizeitpark darfst du mitfahren, wenn du mindestens 120 cm groß bist – oder wenn du mindestens 8 Jahre alt bist und mit einem Erwachsenen fährst. Speichere eine Größe von 115, ein Alter von 9 und with_adult = true. Gib dann aus, ob dieses Kind mitfahren darf. Tipp: Fasse den Teil „Alter und Erwachsener“ mit Klammern zusammen.
Lösung anzeigen
fn main() { let height_cm = 115; let age = 9; let with_adult = true;
let tall_enough = height_cm >= 120; let can_ride = tall_enough || (age >= 8 && with_adult);
println!("groß genug: {tall_enough}"); println!("darf mitfahren: {can_ride}");}Ausgabe:
groß genug: falsedarf mitfahren: true2. Schaltjahre
Abschnitt betitelt „2. Schaltjahre“Ein Jahr ist ein Schaltjahr, wenn es durch 4 teilbar ist, aber nicht durch 100 – oder wenn es durch 400 teilbar ist. Berechne ein Boolean is_leap für 2024, gib es aus und mach dasselbe für 1900. Tipp: „durch 4 teilbar“ ist year % 4 == 0, und du kannst year und is_leap mit einem zweiten let verschatten (Shadowing).
Lösung anzeigen
fn main() { let year = 2024; let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; println!("{year} ist ein Schaltjahr: {is_leap}");
let year = 1900; let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; println!("{year} ist ein Schaltjahr: {is_leap}");}Ausgabe:
2024 ist ein Schaltjahr: true1900 ist ein Schaltjahr: falseZusammenfassung
Abschnitt betitelt „Zusammenfassung“boolhat genau zwei Werte:trueoderfalse.- Vergleiche (
==,<,>=, …) liefern Booleans. - Bedingungen in
ifmüssen ein echtesboolsein – keine automatische Umwandlung von Zahlen oder Strings. &&und||werten kurzschlussartig aus: Sie überspringen die rechte Seite, sobald das Ergebnis feststeht. Setz Sicherheitsprüfungen also nach links.
Kurzer Check
Abschnitt betitelt „Kurzer Check“Kurzer Check
1. Welchen Typ liefert ein Vergleich wie age >= 18?
2. Kannst du in Rust eine Ganzzahl wie 0 direkt als Bedingung in einem if verwenden, so wie in manchen anderen Sprachen?
3. Was passiert bei count != 0 && total / count > 10, wenn count gleich 0 ist?
Punkte: 0 / 3
Weiterlesen
Abschnitt betitelt „Weiterlesen“- Der boolesche Typ – Die Programmiersprache Rust: die kurze offizielle Einführung in
bool, zusammen mit den anderen Grundtypen. bool– Doku der Standardbibliothek (auf Englisch): alle Methoden vonbool, etwathenundthen_some– für später, wenn du so weit bist.- Lazy boolean operators – The Rust Reference (auf Englisch): die genauen Regeln, wie
&&und||ihre rechte Seite überspringen. - Primitives – Rust by Example (auf Englisch):
boolneben den anderen eingebauten Typen von Rust, mit einem lauffähigen Beispiel.