Temeller
while, bir bool koşul true kaldığı sürece gövdesini çalıştırır:
while condition {
// gövde
}
Compiler koşulu her iterasyondan önce değerlendirir:
true— gövdeyi çalıştır, sonra tekrar kontrol et.false— döngüden çık.
Zero örneklerinden, zaten false olan bir koşulla basit bir gösterim:
Bunu çalıştırın ve yalnızca ikinci write tetiklenir. while'ın gövdesi asla çalışmaz çünkü koşul ilk kontrol edildiğinde false'tu.
Koşul Bir bool
If/else'de olduğu gibi, döngü koşulu bir bool olmak zorundadır. Zero, integer, string veya başka değerleri boolean'a coerce etmez.
while count { // compile error
// ...
}
while count > 0 { // OK
// ...
}
Koşul, bool'a değerlenen herhangi bir şey olabilir: bir bağlama, bir karşılaştırma, bir &&/|| kombinasyonu ya da bir fonksiyon çağrısı. if'ten gelen aynı kurallar geçerli.
Counted Döngüler
Klasik "bir şeyi N kere yap" deseni bir counter ve bir while kullanır:
let mut i = 0
while i < 10 {
// iş yap
i = i + 1
}
Üç parça: bir başlangıç değeri, sınıra karşı bir koşul ve gövdenin içinde bir güncelleme. Bu, her imperative dilin sahip olduğu desen — Zero sadece onu bir for anahtar kelimesiyle süslemiyor.
Yukarıdaki mut yazımı üzerine bir not: Zero'nun toolchain'inizde mutable bağlamaları nasıl yazdığı pre-1.0 sürümlerde farklı olabilir. Compiler'ınızın kabul ettiği kesin söz dizimini doğrulamak için küçük bir test'e karşı zero check --json çalıştırın. Kavramsal desen (counter + koşul + güncelleme) kararlı kısımdır.
Sonsuz Döngüler
Koşulu her zaman true olan bir while sonsuza kadar çalışır:
while true {
// işi bekle, ele al, tekrar döngüye gir
}
Bu, bir event loop, bir REPL ya da uzun süreli çalışan bir sunucu için doğru biçim. Çıkmak için ya process'i sonlandırırsınız, gövdeden bir hata raise edersiniz ya da koşulu kıracak şekilde yeniden yapılandırırsınız.
Bir Döngüye Ne Zaman Başvurulur
Döngüler tutumlu kullanılması gereken bir araç. Diğer dillerde döngü gibi görünen şeylerin Zero'da çoğu zaman daha temiz bir biçimi vardır:
- Sabit bir collection üzerinde iterasyon: standart kütüphanenin ya da shape'inizin sunduğu bir fonksiyonu tercih edin —
forEachtarzı bir helper, bir folder ya da rekürsif bir gezinti. - Input'un sonuna kadar okuma: başarısızlığa açık bir read üzerinde döngü yapın, ama sınırı temiz şekilde ele almak için status bayrakları iç içe yığmak yerine
checkveraiseskullanın. - Bir koşul için polling: tasarımın size bunun yerine bir sinyal vermesi gerekip gerekmediğini düşünün. Polling döngüleri herhangi bir sistem dilinde bir kötü kokudur.
Aynı içgüdü ajanlar için de geçerli: sıkı, declarative bir biçim, hem insanlar hem de kod üreticileri için elle yazılmış bir counter döngüsünden daha kolay muhakeme edilir.
Döngüler ve Effect'ler
Bir while gövdesi, başka herhangi bir blok gibi, I/O yapabilir — ancak yalnızca bir World capability (veya onun bir parçası) varsa. İmzasında World'ten söz etmeyen bir fonksiyon istediği kadar döngü yapabilir ama dışarıya hiçbir şey yazamaz. Bu özellik döngü gövdesinin içinde de geçerlidir; döngü yeni capability'ler bahşetmez.
Bu apaçık görünüyor, ama "pure" bir hesaplama fonksiyonunun içine bir while koyup yine de imzadan — gövdeyi okumadan — onun ne bir şey yazdırabileceğini ne de diske bir şey yazabileceğini bilebilmenizin sebebi tam olarak bu.
Stil Notları
Karşılığını veren birkaç küçük alışkanlık:
- Koşulu apaçık tutun. Koşul gerçek bir iş yapıyorsa onu isimlendirilmiş bir fonksiyona veya bağlamaya kaldırın, böylece döngü temiz okunur.
- Counter'ı gövdenin sonunda güncelleyin, içine serpiştirmek yerine. Off-by-one bug'ları yakalamak daha kolay.
- İterasyonun ortasında flip eden bayraklar yerine, döngünün kendi koşulu olarak ifade edebileceğiniz erken çıkış koşullarını tercih edin. Daha az hareketli parça.
Sırada: Shape'ler
Artık Zero'nun temel kontrol akışını gördünüz. Bir sonraki bölüm veri modelleme hakkında — Zero'nun struct benzeri product type'ları olan shape'lerle başlıyor.
Sıkça Sorulan Sorular
Zero'da while döngüleri nasıl çalışır?
while condition { ... } kullanın. Koşul her iterasyondan önce değerlenir; true ise gövde çalışır ve döngü yeniden kontrol eder. false ise döngü çıkar ve yürütme kapanan brace'ten sonra devam eder. Koşul bir bool olmak zorundadır.
Zero'nun for döngüsü var mı?
Erken Zero, tek döngü yapısı olarak while ile geliyor. Dil, kararlı hale gelirken yüzeyi bilinçli olarak küçük tutuyor — daha az anahtar kelime, bir ajanın yanlış formu seçmesi için daha az yol demek. Bir range veya collection üzerinde for, sonradan gelebilir; o zamana kadar aynı deseni while ve bir counter ile kurarsınız.
Zero'da counted bir döngü nasıl yazılır?
Bir counter initialize edin, ona karşı bir while çalıştırın ve gövdenin içinde güncelleyin: let mut i = 0; while i < 10 { ...; i = i + 1 }. Mutability söz dizimi pre-1.0 Zero'da hâlâ gelişiyor, dolayısıyla kesin yazım için güncel dokümanlara bakın — ama while + counter + güncelleme deseni standart counted-loop deyimidir.
Zero'da break veya continue var mı?
Zero'nun ailesindeki çoğu dil döngüler için erken çıkış yapısı sunar; pre-1.0 Zero'daki kesin yazım 1.0 öncesi değişebilecek alanlardan biridir. Tutucu yaklaşım, döngüyü koşulun kendisinin işi yapacağı şekilde yapılandırmaktır — koşulu çevirip güncelleyin ki döngü doğal olarak çıksın — belirli bir kontrol akışı anahtar kelimesine güvenmek yerine.
Bir Zero while döngüsü sonsuza kadar çalışabilir mi?
Evet — while true { ... } sonsuz bir döngüdür. Sunucular, event loop'lar, REPL'ler ve doğal bir sonlandırma koşulunun olmadığı her şey için faydalı. Implicit truthiness'ten farklı olarak buradaki true, bool tipinde bir literal'dir, dolayısıyla koşul yine de düzgün tiplendirilmiştir.