Bir Değere İsim Vermenin Tek Yolu
Zero'da bir değere let ile isim verirsiniz:
let answer = 42
Tüm söz dizimi bundan ibaret. var yok, const yok, auto yok. Tek bir bağlama anahtar kelimesi dili küçük tutar — ajanlar ve insanlar her ikisi de onu bir kez öğrenir ve her yerde uygular.
let, mevcut scope'ta yerel bir bağlama tanımlar. Bu satırdan sonra, kapsayan bloğun sonuna kadar answer 42'yi ifade eder.
Tip Çıkarımı
Compiler tipi sağ taraftan çıkarır. 42 literal'inin varsayılan tipi i32'dir, bu yüzden answer bir i32. "hello" literal'i bir string, dolayısıyla:
let greeting = "hello"
greeting'i bir string değere bağlar. Bir Pair<i32, u8> döndüren bir fonksiyon çağırırsanız bağlamanın tipi Pair<i32, u8> olur:
let pair = makePair(40, 2_u8)
Her bağlamada tipi yazmak zorunda değilsiniz, bu da kodu okunabilir tutar.
Explicit Tip Annotation'ları
Tipi belgelemek istediğinizde — ya da inference farklı bir şey seçeceği için belirli birini zorlamak istediğinizde — iki nokta üst üsteden sonra tipi yazın:
let count: u8 = 10
let pair: Pair<i32, u8> = makePair(40, 2_u8)
Annotation'lar bir literal birden fazla tip olabilecekken compiler'a verilen bir ipucu da olur. 10 literal'i i32, i64, u8 gibi olabilir; annotation onu sabitler.
Bağlamayı annotate etmenin alternatifi olarak literal üzerine tip suffix'i de göreceksiniz:
let small = 10_u8 // literal suffix'inden u8
let big = 10_i64 // literal suffix'inden i64
Her iki form da geçerli; çağrı yerinde niyeti hangisi daha net yapıyorsa onu seçin.
Bağlamalar İş Başında
Hem çıkarımlı hem de explicit formları kullanan bir örnek — denemek için Run'a tıklayın:
Sağ tarafı bir struct literal olduğu için point explicit olarak annotate edildi. total ise çıkarımlı — sum i32 döndürmek üzere bildirildiği için bağlama da i32.
Scope ve Shadowing
Bir let bağlaması, onu tanımlayan satırdan kapsayan bloğun sonuna kadar geçerlidir. İç içe bloklar yeni scope'lar yaratır:
pub fun main(world: World) -> Void raises {
let value = 1
if true {
let value = 2 // bu blok içinde dış 'value'yi gölgeler
// burada value == 2
}
// if'in dışına çıkınca value == 1 yine
}
İç value dış olanı mutate etmez — if bloğunun kapanan brace'inde scope dışına çıkan ayrı bir bağlamadır. Bu, Rust ve ML ailesi dillerin modelinin aynısıdır. Özellikle bir değeri bir dizi adım üzerinden dönüştürmek isterken her ara sonuç için yeni isim icat etmemek için yaygın bir yöntem.
let'in Yapmadığı Şeyler
Diğer dillerden bekleyebileceğiniz, let'in bilinçli olarak dahil etmediği birkaç şey:
- Yalnızca tip bildirimleri. Initialize edilmemiş bir bağlama tanıtan
let x: i32;formu yok. Bir bağlamanın tanımlandığı anda bir değeri olması gerekir. - Pattern destructuring (henüz). Bazı diller
let (a, b) = pairyazmanıza izin verir. Zero tasarım gereği küçük ve şu an için sadece düz isim bağlamalarına odaklanıyor — destructuring'in eklenip eklenmediği için güncel dokümanlara bakın. - Farklı ömürler için birden çok anahtar kelime. Ayrı bir
static,const,let mutya da block-scoped/function-scoped varyantı yok. Tek anahtar kelime.
Geçmişiniz JavaScript ise en yakın analoji const — bloğun geri kalanı için bir değere bağlanmış bir isim, iç scope'larda shadowing ile. Geçmişiniz Rust ise buradaki let, Rust'taki let'in explicit mut anahtar kelimesi olmadan oynadığı role denk gelir.
Bir Desen: Adım Adım Bir Değer Oluşturmak
Bağlamalar, bir hesaplamayı isimlendirilmiş ara adımlar dizisi olarak yazmak istediğinizde parlar. Bu hem insanların okuması hem de ajanların her satır hakkında yerel olarak muhakeme yapması için iyidir:
Her satır fonksiyonun geri kalanının üzerinde çalışacağı yeni bir gerçek tanıtır. Compiler yine sıkı bir kod üretir — ara değerleri isimlendirmenin runtime maliyeti yok.
Sırada: Primitive Tipler
let'in bir şeye bağlamadan pek anlamı yok. Bir sonraki yazı Zero'nun primitive tiplerini anlatıyor — en sık göreceğiniz integer genişlikleri, float'lar, string'ler ve Void ile Bool tipleri.
Sıkça Sorulan Sorular
Zero'da bir değişkeni nasıl tanımlarım?
let kullanın. Tip çıkarımlı form let name = value, explicit tip yazmak için ise let name: Type = value şeklindedir. Örneğin: let answer = 42 ya da let answer: i32 = 42. Her ikisi de mevcut scope'ta answer ismini 42 değerine bağlar.
Zero, let bağlamaları için tip çıkarımı yapar mı?
Evet. let total = sum(point) yazarsanız ve sum i32 döndürüyorsa, bağlamanın tipi i32 olarak çıkarılır. Tipi belgelemek ya da belirli bir tipe zorlamak istediğinizde hâlâ explicit annotation yazabilirsiniz — örneğin let count: u8 = 10.
Zero'da let bağlamaları mutable midir?
Düz let mevcut scope içinde kullanım için yerel bir bağlama tanımlar. Pre-1.0 Zero'da mutability hikayesi hâlâ gelişiyor — dil explicit effect'leri ve öngörülebilir memory'yi vurgular, bu yüzden bir bağlama üzerinden state mutate eden her şey bunu görünür kılmak zorundadır. Toolchain sürümünüzdeki kesin mutability söz dizimi için güncel Zero dokümanlarına bakın.
Zero'da let ile const arasındaki fark nedir?
Zero, fonksiyon gövdesi içindeki sıradan yerel bağlamalar için let kullanır. JavaScript'in let/const/var'ı gibi birden fazla bağlama anahtar kelimesi sunmaz — yüzeyi küçük tutmak bilinçli bir tasarım tercihi. Compile-time sabitler genellikle ayrı bir anahtar kelime yerine type system veya top-level bildirimler üzerinden ifade edilir.
Zero'da bir let bağlamasını yeniden tanımlayabilir miyim?
Bağlamalar onları çevreleyen scope'ta yaşar. Daha iç bir scope'taki aynı isimle yeni bir let, iç scope süresince dış olanı gölgeleyen ayrı bir bağlamadır — iç scope bittiğinde dış bağlama etkilenmemiş kalır. Bu, Rust ve ML ailesi dillerin kullandığı modelin aynısıdır.