Tipe Bawaan
Zero memberimu sekumpulan tipe primitif yang kecil dan teratur. Tidak ada yang aneh, tidak ada yang mengejutkan: hanya tipe yang dibutuhkan setiap bahasa sistem, dengan penamaan yang konsisten.
| Kelompok | Tipe | Catatan |
|---|---|---|
| Integer bertanda | i8, i16, i32, i64 | Two's complement. |
| Integer tak bertanda | u8, u16, u32, u64 | Hanya 0 dan positif. |
| Seukuran pointer | usize, isize | Lebarnya sama dengan pointer platform. |
| Float | f32, f64 | IEEE-754. |
| Boolean | bool | true atau false. |
| Karakter | char | Satu skalar Unicode. |
| String | String | String UTF-8. |
| Kosong | Void | "Tidak ada nilai yang berguna." |
Itulah daftar lengkap tipe primitif yang akan kamu pakai sehari-hari. Tipe gabungan, yaitu shape, enum, dan choice, dibangun dari tipe-tipe ini.
Integer
Tipe integer mengikuti pola penamaan yang seragam: i untuk bertanda, u untuk tak bertanda, diikuti lebar bitnya. Jadi i32 adalah integer bertanda 32 bit, u8 adalah byte tak bertanda, dan i64 adalah integer bertanda 64 bit.
let small_signed: i8 = -120
let byte: u8 = 250
let id: i32 = 1
let big: i64 = 9_000_000_000
let index: usize = 0
Default untuk literal tanpa akhiran adalah i32, kecuali konteks di sekitarnya memaksakan tipe lain:
let answer = 42 // i32
Saat kamu butuh lebar tertentu, tambahkan akhiran pada literal atau tulis anotasi pada binding:
let byte = 250_u8 // typed literal
let byte: u8 = 250 // typed binding
Kedua bentuk itu menghasilkan nilai yang sama. Bentuk akhiran literal praktis saat kamu mengirim literal langsung ke sebuah fungsi atau membangun sebuah struct:
let pair: BytePair = Pair { left: 1_u8, right: 2_u8 }
Kapan memilih lebar yang mana
Panduan singkatnya:
i32untuk sebagian besar perhitungan bertanda. Cukup lebar untuk hampir semua yang perlu kamu hitung, dan cepat di semua platform.u8untuk pekerjaan tingkat byte. Byte dari file, byte di buffer, byte yang dikirim lewat jaringan.u32/u64untuk jumlah yang tidak negatif saat rentangnya penting. Offset file di atas 2 GB, jumlah yang besar.usizeuntuk ukuran dan indeks. Seukuran pointer, sama dengan yang dipakai platform untuk pengalamatan memori.i64untuk waktu sejak epoch dan sejenisnya. Cukup besar untuk menyimpan nanodetik selama ratusan tahun.
Memilih tipe terkecil yang muat adalah kebiasaan yang baik. Memilih tipe yang terlalu kecil lalu terjadi overflow jauh lebih bermasalah daripada memilih tipe yang sedikit terlalu lebar.
Boolean
let ok = true
let done: bool = false
bool punya tepat dua nilai: true dan false. Keduanya literal, bukan konstanta yang kamu import dari suatu tempat. Kondisi di dalam if atau while adalah bool. Tidak ada truthiness implisit untuk integer atau string.
if ok {
check world.out.write("yes\n")
} else {
check world.out.write("no\n")
}
If/else membahas percabangan secara detail.
Float
f32 dan f64 adalah bilangan floating point IEEE-754 masing-masing 32 bit dan 64 bit. Pakai keduanya saat kamu butuh nilai pecahan, seperti pengukuran, rasio, dan geometri. Untuk perhitungan uang yang harus tepat, lebih baik pakai integer dalam satuan terkecil (sen, satoshi) daripada float.
let ratio: f32 = 0.5
let pi: f64 = 3.141592653589793
f64 adalah default untuk literal float tanpa akhiran.
Karakter dan String
char menyimpan satu nilai skalar Unicode:
let initial: char = 'Z'
String adalah urutan karakter, yang biasanya di-encode sebagai UTF-8 oleh standard library. Literal string memakai tanda kutip ganda:
let message: String = "hello from zero\n"
Escape sequence yang umum juga berfungsi: \n untuk baris baru, \t untuk tab, \\ untuk backslash literal, dan \" untuk tanda kutip ganda literal.
let multi_line = "line one\nline two\n"
Standard library menyediakan tampilan tingkat byte atas sebuah string untuk pekerjaan tingkat rendah. Bentuk std.mem.span("zero") mengembalikan Span<u8> atas byte-byte tersebut, yang berguna saat kamu mem-parsing, membuat hash, atau membandingkan byte demi byte.
Void
Void adalah tipe "tidak ada nilai kembalian yang berguna" di Zero. Fungsi yang ada untuk efek sampingnya memakai tipe ini:
pub fun main(world: World) -> Void raises {
check world.out.write("hello\n")
}
main menulis sesuatu lalu selesai. Tidak ada nilai yang perlu dikembalikan, jadi tipenya Void. Kamu akan melihat Void di sebagian besar fungsi yang menyentuh World, karena fungsi-fungsi itu dipakai untuk efeknya, bukan untuk hasilnya.
Garis Bawah dalam Literal Angka
Literal angka yang panjang bisa memakai garis bawah sebagai pemisah visual. Compiler mengabaikannya, jadi ini murni fitur untuk keterbacaan:
let big = 9_000_000_000_i64
let bytes = 1_048_576_u32 // 1 MiB
Taruh garis bawah di mana pun digitnya mulai sulit dihitung.
Cheat Sheet Akhiran Literal Bertipe
| Akhiran | Tipe | Contoh |
|---|---|---|
_i8 / _i16 / _i32 / _i64 | Integer bertanda | 127_i8 |
_u8 / _u16 / _u32 / _u64 | Integer tak bertanda | 255_u8 |
_usize / _isize | Seukuran pointer | 0_usize |
_f32 / _f64 | Float | 0.5_f32 |
Pakai akhiran ini saat kamu membuat nilai yang tipenya tidak ditentukan oleh konteks di sekitarnya.
Berikutnya: Fungsi
Tipe primitif tidak berguna tanpa sesuatu untuk dikerjakan dengannya. Dokumen berikutnya membahas fungsi di Zero: cara mendeklarasikannya, mengembalikan nilai darinya, dan menggabungkannya untuk membangun program sungguhan.
Pertanyaan yang sering diajukan
Tipe primitif apa saja yang dimiliki Zero?
Zero menyediakan integer bertanda dengan ukuran tetap i8, i16, i32, i64; integer tak bertanda u8, u16, u32, u64; integer seukuran pointer usize dan isize; float f32 dan f64; bool; char; String; dan Void untuk fungsi yang tidak mengembalikan nilai yang berguna.
Apa tipe integer default di Zero?
Literal integer tanpa akhiran seperti 42 secara default bertipe i32, kecuali konteksnya memaksakan tipe lain. Untuk memakai lebar tertentu, tulis literal dengan akhiran seperti 42_u8 atau 42_i64, atau tulis anotasi tipe binding secara eksplisit dengan let count: u8 = 42.
Apakah Zero punya tipe string tersendiri?
Ya. Literal string seperti "hello" punya tipe string bawaan yang diperlakukan oleh standard library sebagai urutan byte (biasanya UTF-8). Untuk pekerjaan tingkat byte yang lebih rendah, standard library menyediakan span dan utilitas tingkat byte. Untuk operasi tingkat karakter, ada char untuk satu nilai skalar.
Apa arti Void di Zero?
Void adalah tipe kembalian fungsi yang tidak menghasilkan nilai yang berguna, karena fungsi itu hanya ada untuk efek sampingnya. Signature standar pub fun main(world: World) -> Void raises memakai Void karena main ada untuk melakukan I/O lalu keluar, bukan untuk menghasilkan nilai.
Apa bedanya i32 dan u32 di Zero?
i32 adalah integer bertanda 32 bit dengan rentang −2.147.483.648 sampai 2.147.483.647. u32 tidak bertanda dan rentangnya 0 sampai 4.294.967.295. Pakai tipe bertanda saat nilai negatif punya arti, dan tipe tak bertanda saat nilai negatif berarti bug, misalnya untuk jumlah, indeks, ukuran, dan sejenisnya.