Variabel & Mutability — Rust

Variabel & Mutability di Rust Di Rust, variabel secara default bersifat immutable (tidak bisa diubah). Ini adalah fitur keamanan utama Rust. Deklarasi…

Variabel adalah kotak bernama yang menyimpan satu nilai. Di Rust, kotak yang dibuat dengan let langsung disegel: isinya gak bisa diganti, kecuali kamu menandainya mut sejak awal. Bayangin papan-papan di Kedai Martabak Bang Rusdi. Daftar harga dicetak di menu laminating, sekali jadi gak diubah lagi: itu let. Stok telur ditulis di papan tulis, dihapus dan ditulis ulang tiap ada martabak telur terjual: itu let mut. Nama kedai dicat di spanduk sebelum buka dan sama di mana pun: itu const. Kadang Bang Rusdi menempel kertas baru berlabel sama di atas catatan lama, jadi yang terbaca catatan baru: itu shadowing.

🧪 Tebakan cepat: kode ini dibuat tanpa mut, lalu stoknya dikurangi 3. Apakah lolos compile dan mencetak 247?

let stok_telur = 250;
stok_telur -= 3;

Tebak dulu, jawabannya ada di bagian "Immutable secara default".

let: kotak bernama

fn main() {
    let harga_manis = 32000;
    let porsi = 2;
    println!("Total: {}", harga_manis * porsi);
}

Output-nya Total: 64000.

Immutable secara default

Immutable artinya gak bisa diubah. Tiap variabel let di Rust immutable, kecuali kamu bilang sebaliknya. Ini program stok telur kedai, dibuat tanpa mut:

fn main() {
    let stok_telur = 250;
    println!("Stok telur: {}", stok_telur);
    stok_telur -= 3;
    println!("Stok telur: {}", stok_telur);
}
error[E0384]: cannot assign twice to immutable variable `stok_telur`
 --> src/main.rs:4:5
  |
2 |     let stok_telur = 250;
  |         ---------- first assignment to `stok_telur`
3 |     println!("Stok telur: {}", stok_telur);
4 |     stok_telur -= 3;
  |     ^^^^^^^^^^^^^^^ cannot assign twice to immutable variable
  |
help: consider making this binding mutable
  |
2 |     let mut stok_telur = 250;
  |         +++

Kenapa dibuat begini? Saat membaca kode, kamu bisa yakin nilai let gak berubah diam-diam di tempat lain. Yang perlu berubah harus terang-terangan ditandai.

let mut: boleh diubah

fn main() {
    let mut stok_telur = 250;
    println!("Stok telur: {}", stok_telur);
    stok_telur -= 3;
    println!("Stok telur: {}", stok_telur);
}
Stok telur: 250
Stok telur: 247

Shadowing: let lagi dengan nama yang sama

fn main() {
    let stok_telur = 250;
    println!("Stok telur: {}", stok_telur);
    let stok_telur = stok_telur - 3;
    println!("Stok telur: {}", stok_telur);
    let stok_telur = "tinggal sedikit";
    println!("Stok telur: {}", stok_telur);
}
Stok telur: 250
Stok telur: 247
Stok telur: tinggal sedikit

const: nilai tetap untuk seluruh program

const HARGA_TELUR: u32 = 38000;

fn main() {
    println!("Martabak telur: {}", HARGA_TELUR);
}

mut atau shadowing?

let mut Shadowing (let lagi)
Variabelnya tetap yang sama, isinya diganti variabel baru, yang lama tertutup
Ganti tipe gak boleh boleh
Cara menulis stok_telur -= 3; let stok_telur = stok_telur - 3;

Pakai let mut untuk nilai yang terus berubah, seperti stok selama kedai buka. Pakai shadowing untuk mengolah nilai jadi bentuk baru sekali jalan, misalnya angka yang diubah jadi teks.

⚠️ Jebakan yang sering ketemu

TL;DR: let membuat variabel yang immutable: mengisinya ulang ditolak dengan cannot assign twice to immutable variable, dan saat compile gagal gak ada baris yang jalan. let mut membolehkan isi berubah (stok_telur -= 3;), tapi tipenya tetap. Shadowing, let lagi dengan nama yang sama, membuat variabel baru yang boleh beda tipe dan boleh membaca nilai lamanya (let angka = angka * 3;). const ditulis huruf besar, wajib bertipe, dan nilainya pasti sejak compile.

Yang akan kamu pelajari