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 programlama dilleri çizimi

Coddy ile kodlamayı öğren

Başla