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
boolbağ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 { ... }. booldö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.