Yerleşik Tipler
Zero size küçük ve düzenli bir primitive tip seti verir. Egzotik bir şey yok, sürpriz bir şey yok — her sistem dilinin ihtiyaç duyduğu tipler, tutarlı biçimde adlandırılmış.
| Aile | Tipler | Notlar |
|---|---|---|
| Signed integer | i8, i16, i32, i64 | İkiye tümleyen. |
| Unsigned integer | u8, u16, u32, u64 | Yalnızca 0 ve pozitif. |
| Pointer boyutunda | usize, isize | Genişlik platform pointer'ına eşittir. |
| Float | f32, f64 | IEEE-754. |
| Boolean | bool | true veya false. |
| Karakter | char | Tek bir Unicode scalar. |
| String | String | UTF-8 string. |
| Boş | Void | "Faydalı bir değer yok." |
Günlük olarak dokunacağınız primitive'lerin tam listesi bu kadar. Compound tipler — shape'ler, enum'lar, choice'lar — bunlardan inşa edilir.
Integer'lar
Integer tipleri tutarlı bir adlandırma desenini takip eder: signed için i, unsigned için u, sonrasında bit genişliği. Yani i32 32-bit signed integer; u8 unsigned bir byte; i64 64-bit signed bir integer.
let small_signed: i8 = -120
let byte: u8 = 250
let id: i32 = 1
let big: i64 = 9_000_000_000
let index: usize = 0
Suffix'siz bir literal için varsayılan, çevreleyen context başka bir şeyi zorlamadığı sürece i32'dir:
let answer = 42 // i32
Belirli bir genişliğe ihtiyacınız varsa literal'e bir suffix takın ya da bağlamayı annotate edin:
let byte = 250_u8 // tipli literal
let byte: u8 = 250 // tipli bağlama
Her iki form da aynı değeri üretir. Literal-suffix formu, bir literal'i doğrudan bir fonksiyona geçerken ya da bir struct kurarken işe yarar:
let pair: BytePair = Pair { left: 1_u8, right: 2_u8 }
Hangi genişliği ne zaman seçmeli
Kısa bir kural:
i32çoğu signed matematik için. Sayacağınız hemen her şey için yeterince geniş, her platformda hızlı.u8byte seviyesi işler için. Dosyadaki byte'lar, buffer'daki byte'lar, network'teki byte'lar.u32/u64negatif olmayan sayımlar için, aralık önemliyse. 2 GB üzeri dosya offset'leri, büyük sayımlar.usizeboyutlar ve index'ler için. Pointer boyutunda — platformun memory adresleme için kullandığı şeye eşit.i64epoch'tan beri geçen zaman ve benzeri için. Yüzlerce yıl boyunca nanosaniye için yeterli.
İhtiyacınız olan en küçük tipi seçmek iyi bir alışkanlıktır; çok küçük seçip overflow yapmak ise bir bit fazlasını seçmekten çok daha büyük bir problem.
Boolean'lar
let ok = true
let done: bool = false
bool'un kesinlikle iki değeri vardır: true ve false. Bunlar literal'dir, bir yerden import edilmiş sabitler değil. if veya while'daki koşul bir bool'dur — integer veya string için implicit truthiness yoktur.
if ok {
check world.out.write("yes\n")
} else {
check world.out.write("no\n")
}
If/else koşulları detaylı ele alıyor.
Float'lar
f32 ve f64 sırasıyla 32-bit ve 64-bit IEEE-754 floating-point sayılardır. Kesirli değerlere ihtiyaç duyduğunuzda — ölçümler, oranlar, geometri — bunları kullanın. Para birimi üzerinde kesin aritmetik için float yerine en küçük birimde (kuruş, satoshi) integer tercih edin.
let ratio: f32 = 0.5
let pi: f64 = 3.141592653589793
Suffix'siz float literal'lerin varsayılanı f64'tür.
Karakter ve String
Bir char tek bir Unicode scalar değer tutar:
let initial: char = 'Z'
Bir String ise karakterlerin bir dizisidir; standart kütüphane tarafından genellikle UTF-8 olarak encode edilir. String literal'ler çift tırnak kullanır:
let message: String = "hello from zero\n"
Beklediğiniz escape sequence'ler çalışır — \n yeni satır için, \t tab için, \\ literal ters slash için, \" literal çift tırnak için.
let multi_line = "line one\nline two\n"
Standart kütüphane düşük seviyeli işler için bir string üzerinde byte seviyesi görünümler sunar. std.mem.span("zero") formu byte'lar üzerinde bir Span<u8> döndürür — parse ederken, hash'lerken ya da byte bazlı karşılaştırma yaparken faydalı.
Void
Void, Zero'nun "faydalı dönüş değeri yok" tipidir. Side effect'leri için var olan fonksiyonlar bunu kullanır:
pub fun main(world: World) -> Void raises {
check world.out.write("hello\n")
}
main bir şey yazar ve döner. Geri verilecek bir değer yok, dolayısıyla tip Void. World'e dokunan çoğu fonksiyonda Void göreceksiniz — sonuçları için değil etkileri için seçilirler.
Sayı Literal'lerinde Underscore
Uzun sayı literal'leri görsel ayraç olarak underscore kullanabilir. Compiler bunları yok sayar, dolayısıyla saf bir okunabilirlik özelliğidir:
let big = 9_000_000_000_i64
let bytes = 1_048_576_u32 // 1 MiB
Rakamları saymak zorlaştığı her yere serpiştirin.
Tipli Literal Suffix Özeti
| Suffix | Tip | Örnek |
|---|---|---|
_i8 / _i16 / _i32 / _i64 | Signed integer | 127_i8 |
_u8 / _u16 / _u32 / _u64 | Unsigned integer | 255_u8 |
_usize / _isize | Pointer boyutunda | 0_usize |
_f32 / _f64 | Float | 0.5_f32 |
Çevreleyen context tipi sabitlemiyorsa bir değer oluştururken bunları kullanın.
Sırada: Fonksiyonlar
Primitive'ler onlarla bir şey yapmadan işe yaramaz. Bir sonraki yazı Zero'da fonksiyonları anlatıyor — nasıl tanımlanırlar, değer nasıl döndürülür ve gerçek programlar oluşturmak için nasıl bir araya getirilirler.
Sıkça Sorulan Sorular
Zero'nun hangi primitive tipleri var?
Zero, sized signed integer'lar i8, i16, i32, i64; unsigned integer'lar u8, u16, u32, u64; pointer boyutunda integer'lar usize ve isize; float'lar f32 ve f64; bool; char; String ve faydalı bir değer döndürmeyen fonksiyonlar için Void ile birlikte gelir.
Zero'da varsayılan integer tipi nedir?
42 gibi suffix'siz bir integer literal, context farklı bir tipi zorlamadığı sürece varsayılan olarak i32'dir. Belirli bir genişlik için literal'i 42_u8 veya 42_i64 gibi bir suffix ile yazın ya da bağlamanın tipini let count: u8 = 42 ile explicit annotate edin.
Zero'nun ayrı bir string tipi var mı?
Evet. "hello" gibi string literal'ler, standart kütüphanenin bir byte dizisi (genellikle UTF-8) olarak ele aldığı yerleşik bir string tipine sahiptir. Daha düşük seviyeli byte işleri için standart kütüphane span'ler ve byte seviyesi yardımcılar sunar; karakter seviyesi işlemler içinse tek tek scalar değerler için char vardır.
Zero'da Void ne anlama gelir?
Void, faydalı bir değer üretmeyen — yalnızca side effect'leri için var olan — bir fonksiyonun dönüş tipidir. Geleneksel pub fun main(world: World) -> Void raises imzası Void kullanır çünkü main, bir değer üretmek için değil, I/O yapıp çıkmak için vardır.
Zero'da i32 ile u32 arasındaki fark nedir?
i32, -2.147.483.648 ile 2.147.483.647 aralığına sahip signed 32-bit bir integer'dır. u32 unsigned'dır ve aralığı 0 ile 4.294.967.295'tir. Negatif değerler anlamlıyken signed tiplerini, negatif değerlerin bir bug olacağı durumlarda — sayım, index, boyut vb. — unsigned tipleri kullanın.