Rust memiliki kumpulan tipe primitif (Primitives) yang lengkap, terbagi menjadi dua kelompok besar yaitu tipe skalar dan tipe majemuk.
(I) Tipe Skalar (Scalar Types)
Mewakili satu nilai mandiri yang tunggal, ada total 6 jenis:
- Bilangan bulat bertanda:
i8,i16,i32,i64,i128,isize(ukuran menyesuaikan ukuran pointer sistem) - Bilangan bulat tak bertanda:
u8,u16,u32,u64,u128,usize(ukuran menyesuaikan ukuran pointer sistem) - Tipe titik mengambang:
f32,f64 - Tipe karakter char: menyimpan nilai skalar Unicode (contoh:
'a','α','∞'), setiap karakter memakai 4 byte - Tipe boolean bool: hanya memiliki dua nilai yaitu
truedanfalse - Tipe unit (): satu-satunya nilai adalah tuple kosong
(). Meskipun bentuknya tuple, hanya berisi satu nilai sehingga tidak termasuk tipe majemuk.
(II) Tipe Majemuk (Compound Types) (akan dipelajari di bagian akhir)
Dibentuk dari gabungan beberapa nilai:
- Array: contoh
[1, 2, 3] - Tuple: contoh
(1, true)
1) Cara anotasi tipe variabel
Semua variabel bisa diberi tipe secara manual. Tipe numerik mendukung tambahan akhiran tipe; jika tidak diberi anotasi, tipe bawaan akan digunakan:
- Bilangan bulat bawaan:
i32 - Titik mengambang bawaan:
f64
Rust juga bisa menyimpulkan tipe secara otomatis berdasarkan konteks kode.
2) Tipe Variabel
1. Anotasi tipe eksplisit
Tulis : tipe langsung setelah nama variabel untuk menentukan tipe, berlaku untuk semua variabel.
fn main() {
let isOpen: bool = true;
let price: f64 = 1.0;
}Code language: JavaScript (javascript)
Dari contoh di atas, isOpen dan price adalah variabel, bagian : nama_tipe setelah nama variabel berarti kita secara terang-terangan mendeklarasikan tipe variabel tersebut.
2. Anotasi akhiran numerik
Tambahkan akhiran tipe setelah nilai angka untuk menentukan tipe angka, hanya bisa dipakai untuk bilangan.
fn main() {
let an_integer = 5i32;
}Code language: JavaScript (javascript)
Kali ini kita tidak pakai : untuk menentukan tipe variabel, melainkan tambahkan i32 di belakang angka yang di-assign untuk menandakan bilangan bulat 32 bit.
3. Aturan tipe bawaan
Jika tidak pakai anotasi maupun akhiran sama sekali, kompiler akan pakai tipe bawaan:
- Literal bilangan bulat → bawaan
i32 - Literal titik mengambang → bawaan
f64
fn main() {
let default_float = 3.0; // otomatis f64
let default_integer = 7; // otomatis i32
}Code language: JavaScript (javascript)
4. Penyimpulan tipe berdasarkan konteks
Kompiler bisa menebak tipe asli variabel secara otomatis dari kode setelahnya, tidak perlu anotasi manual.
fn main() {
let mut inferred_type = 12;
inferred_type = 4294967296i64; // tipe disimpulkan menjadi i64 dari baris ini
}Code language: JavaScript (javascript)
Variabel Mutable & Karakteristik Variabel
1 Variabel Mutable (Dapat Diubah)
Variabel yang diberi kata kunci mut, nilainya dapat diubah.
fn main() {
let mut mutable = 12;
mutable = 21; // valid, mengubah nilai
}Code language: JavaScript (javascript)
2 Tipe Tidak Dapat Diubah
Sekali tipe variabel ditentukan, sepanjang eksekusi program tidak bisa diganti sama sekali; jika assign nilai tipe lain akan langsung error kompilasi.
fn main() {
let mut mutable = 12;
mutable = 21; // valid, mengubah nilai
mutable = true; // error: tipe awal i32, tidak bisa assign bool
}Code language: JavaScript (javascript)
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0308]: mismatched types
--> hello.rs:5:12
|
3 | let mut mutable = 12;
| -- expected due to this value
4 | mutable = 21; // valid, mengubah nilai
5 | mutable = true; // error: tipe awal i32, tidak bisa assign bool
| ^^^^ expected integer, found `bool`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.Code language: JavaScript (javascript)
Catatan
Di Rust, nilai variabel secara bawaan tidak bisa diubah. Jika ingin bisa diubah, harus tambah kata kunci mut, hal ini berbeda dengan bahasa pemrograman lain.
Contoh kode di bawah ini umum di bahasa lain, tapi akan error di Rust
fn main() {
let mutable:i32 = 12;
mutable = 21; // valid, mengubah nilai
}Code language: JavaScript (javascript)
Error kompilasi
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0384]: cannot assign twice to immutable variable `mutable`
--> hello.rs:4:2
|
3 | let mutable:i32 = 12;
| ------- first assignment to `mutable`
4 | mutable = 21; // valid, mengubah nilai
| ^^^^^^^^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
3 | let mut mutable:i32 = 12;
| +++
warning: variable `mutable` is assigned to, but never used
--> hello.rs:3:6
|
3 | let mutable:i32 = 12;
| ^^^^^^^
|
= note: consider using `_mutable` instead
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
warning: value assigned to `mutable` is never read
--> hello.rs:4:2
|
4 | mutable = 21; // valid, mengubah nilai
| ^^^^^^^^^^^^
|
= help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
error: aborting due to 1 previous error; 2 warnings emitted
For more information about this error, try `rustc --explain E0384`.Code language: JavaScript (javascript)
3 Shadowing Variabel (Penyembunyian Variabel)
Mendeklarasikan ulang variabel dengan nama sama pakai let akan menyembunyikan variabel lama; keduanya variabel terpisah sepenuhnya, tipe bisa berbeda.
fn main() {
let mutable = 12;
let mutable = true; // menyembunyikan variabel tipe i32 di atas, variabel baru bertipe bool
}Code language: JavaScript (javascript)
Tipe Majemuk: Array & Tuple
1. Array
- Sintaks:
[tipe_elemen; panjang], tipe dan panjang tetap, semua elemen harus tipe yang sama.
let my_array: [i32; 5] = [1, 2, 3, 4, 5];Code language: JavaScript (javascript)
2. Tuple
- Dibungkus dengan tanda kurung
(), bisa menyimpan beberapa nilai dengan tipe berbeda-beda.
let my_tuple = (5u32, 1u8, true, -5.04f32);Code language: JavaScript (javascript)