Die Grundlagen
if in Zero sieht ungefähr aus wie if in jeder anderen Sprache der C-Familie, mit einer nennenswerten Einschränkung: Die Bedingung muss ein bool sein.
Die Bedingung value == 42 ist ein bool, weil == zwischen zwei i32s einen bool zurückgibt. Beide Zweige enthalten jeweils einen Block aus Statements. Einer der Zweige darf weggelassen werden – das else ist optional – aber wenn beide vorhanden sind, müssen es jeweils { ... }-Blöcke sein.
Die bool-Pflicht
Manche Sprachen erlauben if value { ... } und behandeln 0, "" oder null als falsy. Zero nicht. Die Bedingung muss ein echter bool sein.
let count = 0
if count { // Compile-Fehler: bool erwartet, i32 erhalten
// ...
}
if count == 0 { // OK
check world.out.write("nothing to do\n")
}
Der Grund ist derselbe wie überall sonst in der Sprache: explizit schlägt implizit. Ein Agent, der die zweite Form liest, weiß genau, was geprüft wird. Die erste Form lässt die Wahrheitsregeln implizit und sie unterscheiden sich zwischen Sprachen – Zero verzichtet darauf.
Else und Else-If
Die else-Klausel läuft, wenn die Bedingung falsch ist:
Bedingungen kettest du mit else if:
if value < 0 {
check world.out.write("negative\n")
} else if value == 0 {
check world.out.write("zero\n")
} else {
check world.out.write("positive\n")
}
else if ist nichts anderes als else { if ... } ohne die Klammern – dieselbe Semantik, weniger Einrückung. Das abschließende else ist optional.
Woraus die Bedingung kommt
Die Bedingung kann alles sein, was zu bool auswertet:
- Ein
bool-Binding:if ok { ... }. - Ein Vergleich:
if value == 42 { ... },if x < y { ... }. - Eine logische Kombination:
if a && b { ... },if pair.left == 1_u8 && pair.right == 2_u8 { ... }. - Ein Funktionsaufruf, der
boolzurückgibt:if isReady(world) { ... }.
Ein praxisnahes Snippet aus den Beispielen der Sprache:
let pair: BytePair = Pair { left: 1_u8, right: 2_u8 }
if pair.left == 1_u8 && pair.right == 2_u8 {
check world.out.write("type alias ok\n")
} else {
check world.out.write("type alias broke\n")
}
&& short-circuited so, wie du es erwartest – ist die linke Seite false, wird die rechte nicht ausgewertet. Genauso für ||.
Wann stattdessen match
if/else if-Ketten sind okay für binäre oder Drei-Wege-Entscheidungen, vor allem wenn die Bedingungen keine gemeinsame Struktur teilen. Aber wenn du über die Varianten eines Summentyps – einer Choice oder eines Enums – verzweigst, ist match das richtige Werkzeug.
Vergleich:
// match – erschöpfend, vom Compiler geprüft
match result {
.ok => value { check world.out.write("ok\n") }
.err => message { check world.out.write("err\n") }
}
vs.
// if/else über einen Summentyp – ausführlicher und fehleranfälliger
if result.isOk() {
let value = result.unwrap()
check world.out.write("ok\n")
} else {
check world.out.write("err\n")
}
Die match-Form macht die Variantenanalyse explizit, und der Compiler meckert, wenn später eine Variante hinzukommt und du vergisst, sie zu behandeln. Die if-Form lässt alles, was nicht ok ist, stillschweigend in den else-Zweig fallen, auch brandneue Varianten, an die du nie gedacht hast.
Faustregel: if für Booleans, match für Varianten.
Stil-Hinweise
Ein paar kleine Konventionen, die Code für Menschen wie Agenten leichter lesbar machen:
- Body immer in geschweifte Klammern. Auch ein einzeiliger Body kommt in
{ ... }. Es gibt keine klammerlose Einzelanweisungs-Form. Das ist Absicht – es hält die Einrückung verlässlich und nimmt eine häufige Bug-Quelle in der C-Familie weg. - Setz den häufigsten Branch nach oben. Leser (und Agenten) scannen von oben nach unten.
- Bevorzuge positive Bedingungen, wenn sie genauso klar sind.
if isReadyliest sich leichter alsif !notReady, sonst alles gleich.
Als Nächstes: While-Schleifen
Konditionale entscheiden was getan wird; Schleifen entscheiden wie oft. Das nächste Dokument behandelt Zeros While-Schleifen, das frühe Loop-Konstrukt, mit dem die Sprache kommt.
Häufig gestellte Fragen
Wie funktionieren If-Anweisungen in Zero?
Verwende if condition { ... } mit einer optionalen else { ... }-Klausel. Die Bedingung muss ein bool sein – Zero konvertiert Integer, Strings oder andere Werte nicht in einen Boolean. Beispiel: if value == 42 { check world.out.write("yes\n") } else { check world.out.write("no\n") }.
Hat Zero einen Ternär-Operator?
Zero hält die Oberfläche bewusst klein und verwendet if/else-Blöcke statt eines separaten condition ? a : b-Ternärs. Die offiziellen Beispiele bevorzugen explizite Branches selbst für kurze Fälle. Wenn deine Sprache if-als-Ausdruck unterstützt, geht Zero eher in diese Richtung, statt eine zweite Syntax einzuführen.
Kann man if/else if in Zero verketten?
Ja. Verkette Bedingungen mit else if zwischen den Branches: if a { ... } else if b { ... } else { ... }. Für aufwendigere Verzweigung über eine choice oder ein enum greif stattdessen zu match – das ist erschöpfend, und der Compiler prüft, dass du jede Variante behandelt hast.
Warum konvertiert Zero Werte nicht zu bool?
Zeros Designphilosophie ist „alles ist explizit“. Implizite Wahrheitswerte – 0, "" oder null als falsch zu behandeln – sind eine häufige Bug-Quelle und für einen Agenten schwer präzise zu durchdenken. Ein echtes bool zu verlangen macht die Verzweigungsentscheidung im Quellcode sichtbar und maschinell leicht verifizierbar.
Wann sollte man match statt if/else verwenden?
Nimm match, wenn du über die Varianten einer choice oder eines enum verzweigst. Der Compiler kann verifizieren, dass du jeden Fall abgedeckt hast – das können if/else if-Ketten nicht. Behalte if/else für einfache boolesche Prädikate – Gleichheitschecks, Vergleiche und kurze Zwei-Wege-Verzweigungen.