29 Apr 2026 503 kali dibaca
Mulai Rust: Aturan yang Aneh, Alasan yang Jelas
Ownership di Rust bukan soal performa. Itu cara compiler memaksa kita menyatakan siapa yang memegang nilai apa, kapan, dan sampai kapan.
Rust 1.0 rilis Mei 2015. Pakai serius kira-kira mulai 2018, saat ekosistem cargo + crates.io sudah cukup ramai. Versi stable sekarang sudah di 1.85+, rilis enam minggu sekali.
Setup awal:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo new hello
cd hello
cargo run
rustup mengelola toolchain (stable, beta, nightly). cargo adalah build tool, package manager, dan task runner sekaligus.
Yang baru bagi yang datang dari C++, Go, atau Python: ownership.
fn main() {
let s = String::from("halo");
let t = s;
println!("{}", s); // error: value borrowed after move
}
Saat let t = s; dijalankan, kepemilikan string pindah dari s ke t. Akses s setelah baris itu adalah error compile-time — bukan runtime, bukan warning, bukan undefined behavior. Compiler menolak file ini.
Aturan dasarnya tiga:
- Setiap nilai punya satu pemilik.
- Hanya satu pemilik pada satu waktu.
- Saat pemilik keluar scope, nilai di-drop.
Kalau ingin dua tempat baca tanpa pindah kepemilikan, gunakan borrow (referensi):
fn print_len(s: &String) {
println!("{}", s.len());
}
fn main() {
let s = String::from("halo");
print_len(&s);
println!("{}", s); // OK, s tetap pemilik
}
Borrow ada dua jenis:
&T— borrow immutable, boleh banyak bersamaan.&mut T— borrow mutable, hanya satu pada satu waktu.
Tidak boleh &T dan &mut T ada bersamaan ke nilai yang sama. Compiler menolak. Ini yang membuat data race tidak mungkin terjadi di kode Rust yang valid — bukan karena lock, melainkan karena tipe.
Aneh? Iya, untuk siapa pun yang biasa di bahasa GC. Pertama kali, program sederhana terasa rumit. Compiler menolak hal yang di Python diam-diam jalan.
Tapi itu bukan compiler yang cerewet. Itu compiler yang memaksa kita menyatakan satu hal yang biasanya tersembunyi: siapa yang memegang nilai ini, dan apa yang berhak orang lain lakukan terhadapnya.
Setelah dua minggu, aturan itu jadi otomatis. Bug memori (use-after-free, double-free, data race) hampir mustahil terjadi. Itu yang dibayar oleh "aneh" di awal.
Result<T, E> dan Option<T> adalah dua tipe yang akan Anda temui di setiap kode. Tidak ada null di Rust. None adalah kasus eksplisit dari Option. Setiap fungsi yang bisa gagal mengembalikan Result.
Kompromi: lebih banyak ? operator dan match expression. Hadiah: tidak pernah NullPointerException.
Ekosistem sudah matang. Untuk web/CLI: axum, reqwest, serde, tokio. Untuk embedded: embedded-hal standar de-facto. Untuk WebAssembly: support first-class.
Rust bukan bahasa yang menyenangkan dipelajari dengan cepat. Tapi bahasa yang menyenangkan dipakai setelah Anda terbiasa.