Menu

Zero If/Else: Koşullu Dallanma

Zero'da if ve else nasıl çalışır: boolean koşullar, dal gövdeleri, truthy coercion'un yokluğu ve daha zengin dallanma için match ile birlikte nasıl kullanılır.

Bu sayfada çalıştırılabilir editörler var — düzenle, çalıştır ve sonucu anında gör.

Temeller

Zero'da if, C ailesi diğer dillerdeki if'e büyük ölçüde benzer; tek dikkat çekici kısıtlama şu: koşul bir bool olmak zorundadır.

value == 42 koşulu bir bool, çünkü iki i32 arasındaki == bir bool döndürür. İki dalın her biri bir ifade bloğu içerir. else opsiyoneldir, ancak her iki dal mevcut olduğunda her ikisi de { ... } blokları olmak zorundadır.

bool Şartı

Bazı diller if value { ... } yazmanıza ve 0, "" ya da null'ı falsy olarak ele almanıza izin verir. Zero buna izin vermez. Koşul gerçek bir bool olmak zorunda.

let count = 0
if count {              // compile error: bool bekleniyor, i32 verildi
    // ...
}

if count == 0 {         // OK
    check world.out.write("nothing to do\n")
}

Sebep, dilin geri kalanında da geçerli olanla aynı: explicit, implicit'i yener. İkinci formu okuyan bir ajan tam olarak neyin kontrol edildiğini bilir. Birinci form truthiness kurallarını implicit bırakır ve diller arasında değişir — Zero bundan vazgeçer.

Else ve Else-If

else clause'u, koşul yanlış olduğunda çalışır:

Koşulları else if ile zincirleyin:

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, brace'leri çıkarılmış bir else { if ... }'dan ibarettir — aynı semantik, daha az girinti. Son else opsiyoneldir.

Koşul Nereden Gelir

Koşul, bool'a değerlenen herhangi bir şey olabilir:

  • Bir bool bağlama: if ok { ... }.
  • Bir karşılaştırma: if value == 42 { ... }, if x < y { ... }.
  • Mantıksal birleşim: if a && b { ... }, if pair.left == 1_u8 && pair.right == 2_u8 { ... }.
  • bool döndüren bir fonksiyon çağrısı: if isReady(world) { ... }.

Dilin örneklerinden gerçek bir snippet:

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")
}

&&, beklediğiniz şekilde short-circuit yapar — sol taraf false ise sağ taraf değerlenmez. || için de aynı.

match'e Ne Zaman Geçilir

if/else if zincirleri ikili veya üç yönlü kararlar için iyi, özellikle koşullar yapı paylaşmıyorsa. Ancak bir sum type'ın — bir choice veya enum'un — variant'ları üzerinde dallanıyorsanız doğru araç match'tir.

Karşılaştırın:

// match — exhaustive, compiler tarafından doğrulanır
match result {
    .ok  => value   { check world.out.write("ok\n") }
    .err => message { check world.out.write("err\n") }
}

ile

// bir sum type üzerinde if/else — verbose ve yanlış yapması kolay
if result.isOk() {
    let value = result.unwrap()
    check world.out.write("ok\n")
} else {
    check world.out.write("err\n")
}

match formu variant analizini explicit yapar ve sonradan bir variant eklenip de ele almayı unutursanız compiler şikayet eder. if formu ise ok olmayan her şeyi — daha önce hiç düşünmediğiniz yepyeni variant'ları bile — sessizce else dalına geçirir.

Kural: boolean'lar için if, variant'lar için match.

Stilistik Notlar

Hem insanların hem de ajanların okumasını kolaylaştıran birkaç küçük konvansiyon:

  • Gövdeyi her zaman brace'leyin. Tek satırlık bir gövde bile { ... } içine gider. Brace'siz tek-ifade formu yok. Bu bilinçli — girintiyi güvenilir tutar ve C ailesi boyunca yaygın bir bug kaynağını ortadan kaldırır.
  • En yaygın dalı en başa koyun. Okuyucular (ve ajanlar) yukarıdan aşağı tarar.
  • Eşit derecede netse pozitif koşulları tercih edin. if isReady, if !notReady'den daha kolay takip edilir.

Sırada: While Döngüleri

Koşullar ne yapılacağına karar verir; döngüler kaç kere yapılacağına karar verir. Bir sonraki yazı, dilin başlangıçta sunduğu döngü yapısı olan Zero'nun while döngülerini ele alıyor.

Sıkça Sorulan Sorular

Zero'da if ifadeleri nasıl çalışır?

if condition { ... } ve isteğe bağlı bir else { ... } clause'u ile kullanın. Koşul bir bool olmak zorundadır — Zero, integer, string veya başka değerleri boolean'a coerce etmez. Örnek: if value == 42 { check world.out.write("yes\n") } else { check world.out.write("no\n") }.

Zero'da ternary operator var mı?

Zero, yüzeyi bilinçli olarak küçük tutar ve ayrı bir condition ? a : b ternary yerine if / else blokları kullanır. Resmi örnekler kısa durumlar için bile explicit dalları tercih eder. Diliniz if-as-expression destekliyorsa, Zero'nun ikinci bir söz dizimi tanıtmak yerine bu yöne meyletmesini bekleyin.

Zero'da if/else if zincirleyebilir misin?

Evet. Koşulları dalların arasına else if yazarak zincirleyin: if a { ... } else if b { ... } else { ... }. Bir choice ya da enum üzerinde daha karmaşık dallanma için match kullanın — daha exhaustive'dir ve compiler her variant'ı ele alıp almadığınızı kontrol eder.

Zero değerleri neden bool'a coerce etmiyor?

Zero'nun tasarım felsefesi 'her şey açıkça belirtilir'. Implicit truthiness — 0, "" veya null'ı false olarak ele almak — bug'ların yaygın bir kaynağıdır ve bir ajanın kesinlikle muhakeme etmesi zordur. Gerçek bir bool istemek, dallanma kararını kaynakta görünür ve mekanik olarak doğrulanabilir kılar.

if/else yerine match'i ne zaman kullanmalıyım?

Bir choice veya enum'un variant'ları üzerinde dallanırken match kullanın. Compiler her case'in ele alındığını doğrulayabilir, if/else if zincirleri ise bunu yapamaz. Basit boolean predicate'ler — eşitlik kontrolleri, karşılaştırmalar ve kısa iki yönlü dallar — için if/else'i tutun.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA