Menu

Tipe Primitif Zero: Integer, Float, Bool, String, Void

Tipe bawaan yang langsung tersedia di Zero: integer bertanda dan tak bertanda dengan berbagai lebar, float, boolean, karakter, string, dan tipe kosong Void.

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.

KelompokTipeCatatan
Integer bertandai8, i16, i32, i64Two's complement.
Integer tak bertandau8, u16, u32, u64Hanya 0 dan positif.
Seukuran pointerusize, isizeLebarnya sama dengan pointer platform.
Floatf32, f64IEEE-754.
Booleanbooltrue atau false.
KaraktercharSatu skalar Unicode.
StringStringString UTF-8.
KosongVoid"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:

  • i32 untuk sebagian besar perhitungan bertanda. Cukup lebar untuk hampir semua yang perlu kamu hitung, dan cepat di semua platform.
  • u8 untuk pekerjaan tingkat byte. Byte dari file, byte di buffer, byte yang dikirim lewat jaringan.
  • u32 / u64 untuk jumlah yang tidak negatif saat rentangnya penting. Offset file di atas 2 GB, jumlah yang besar.
  • usize untuk ukuran dan indeks. Seukuran pointer, sama dengan yang dipakai platform untuk pengalamatan memori.
  • i64 untuk 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

AkhiranTipeContoh
_i8 / _i16 / _i32 / _i64Integer bertanda127_i8
_u8 / _u16 / _u32 / _u64Integer tak bertanda255_u8
_usize / _isizeSeukuran pointer0_usize
_f32 / _f64Float0.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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai