Skip to content

emka.web.id

writing knowledge, recording civilization

Menu
  • Home
  • Tutorial
  • Search
Menu

Cara Memahami Referensi di Rust: Sebuah Panduan Praktis

Posted on September 1, 2024

Dalam bahasa pemrograman Rust, konsep kepemilikan dan peminjaman adalah inti dari manajemen memori. Mari kita bahas lebih lanjut mengenai referensi dalam Rust, dengan terlebih dahulu memahami sistem kepemilikan Rust.

Memahami Sistem Kepemilikan di Rust

Rust memiliki sistem kepemilikan unik, di mana setiap potongan data dalam memori hanya memiliki satu pemilik yang sah. Pemilik ini adalah variabel yang bertanggung jawab atas alokasi dan dealokasi memori untuk data tersebut. Data dapat disimpan di dua tempat: stack atau heap.

  • Stack: Variabel yang memiliki ukuran tetap, seperti integer, float, atau boolean, disimpan di stack. Penempatan data di stack sangat efisien karena prosesnya langsung dan cepat.
  • Heap: Variabel yang dapat berubah ukurannya, seperti string atau vector, disimpan di heap. Alokasi memori di heap lebih fleksibel, namun prosesnya lebih lambat karena memerlukan pencarian lokasi yang tepat di memori.

Contoh:

let x = 2; // Variabel 'x' disimpan di stack

let y = x; // Nilai 'x' disalin ke 'y' (copy murah di stack)

println!("x: {x}"); // Output: x: 2

println!("y: {y}"); // Output: y: 2

Perbedaan stack dan heap menjadi penting ketika kita membahas data di heap.

Contoh:

let a = "hello".to_string(); // Variabel 'a' disimpan di heap

let b = a; // 'b' menjadi pemilik baru data, 'a' menjadi invalid

println!("{a}"); // Error: 'a' tidak valid

Saat ‘b’ menjadi pemilik baru data, ‘a’ kehilangan aksesnya. Hal ini dilakukan agar tidak terjadi akses simultan yang tidak terkendali ke data yang sama.

Referensi dan Peminjaman

Terkadang, kita ingin mengakses data yang dimiliki oleh variabel lain tanpa mengambil kepemilikannya. Inilah konsep peminjaman. Peminjaman dilakukan dengan membuat pointer khusus yang menunjuk ke alamat memori pemilik data, pointer ini disebut referensi.

Contoh:

let a = "hello".to_string();

let b = &a; // 'b' adalah referensi ke 'a'

println!("a: {a}"); // Output: a: hello

println!("b: {b}"); // Output: b: hello

Aturan Peminjaman

Ada beberapa aturan yang harus diikuti saat membuat dan menggunakan referensi:

  1. Referensi selalu valid. Sebuah referensi hanya akan valid selama pemiliknya masih valid. Jika pemilik dipindahkan atau dihapus, semua referensi yang menunjuk padanya menjadi tidak valid.
  2. Pilihan: Referensi tidak dapat berubah atau dapat berubah. Ada dua jenis referensi:
    • Referensi tidak dapat berubah: Referensi ini hanya bisa membaca data. Mereka tidak dapat mengubah nilai yang mereka rujuk.
    • Referensi dapat berubah: Referensi ini dapat mengubah nilai data yang mereka rujuk.

Contoh:

let mut v = vec![0, 1, 2]; // 'v' dapat diubah

// Referensi yang dapat diubah:
let u = &mut v; 
u.push(3); // Mengubah isi 'v' melalui 'u'

println!("vector v: {v:?}"); // Output: vector v: [0, 1, 2, 3]
  1. Hanya satu referensi yang dapat diubah yang diizinkan. Kita hanya bisa memiliki satu referensi yang dapat diubah ke suatu data. Referensi lainnya harus bersifat tidak dapat diubah.

Contoh:

let mut a = vec![0, 1, 2];

let b = &a; // Referensi tidak dapat diubah

let c = &a; // Referensi tidak dapat diubah

let d = &mut a; // Referensi dapat diubah

d.push(3); // Mengubah 'a' melalui 'd'

println!("{c}"); // Error: 'c' tidak valid karena ada referensi 'd' yang dapat diubah

println!("{d:?}"); // Output: [0, 1, 2, 3]

Memperkenalkan Lifetime

Referensi tidak dapat hidup lebih lama daripada pemiliknya.

Contoh:

let s;

{
  let t = 5;
  s = &t; // 's' menunjuk ke 't'
}

println!("{s}"); // Error: 't' tidak valid

Ketika ‘t’ keluar dari cakupannya, ‘s’ menjadi tidak valid karena ‘s’ menunjuk ke memori yang sudah dibebaskan. Untuk menghindari masalah ini, Rust menggunakan konsep lifetime.

Lifetime adalah label yang diberikan kepada bagian dari kode tempat variabel didefinisikan.

Contoh:

fn main() {
  // LIFETIMES

  //---------------------- 'a
  let s;               //|
                       //|
  {                    //|
  //---------------'b    |
    let t = 5;  //|      |
                //|      |
    s = &t      //|      |
  //---------------'b    |
  }                    //|
  //---------------------|'a
}

Dalam contoh ini, ‘s’ memiliki lifetime ‘a’ yang lebih panjang daripada ‘t’ yang memiliki lifetime ‘b’. Ketika ‘t’ keluar dari cakupannya, ‘s’ menjadi tidak valid karena ‘s’ menunjuk ke memori yang sudah dibebaskan.

Lifetime dalam Fungsi

Dalam fungsi, lifetime seringkali diperlukan untuk menunjukkan bagaimana lifetime dari nilai yang dikembalikan terkait dengan lifetime parameter fungsi.

Contoh:

fn example_1() -> &i32 { // Error: 'x' keluar dari cakupannya
  let x = 2;
  &x
}

fn example_2(x: &i32) -> &i32 { // Valid: 'x' tetap valid
  &x
}

fn example_3<'a>(x: &'a i32, y: &'a i32) -> &'a i32 { // Valid: 'x' atau 'y' tetap valid
  &x
}

Kesimpulan

Referensi di Rust adalah konsep penting untuk memahami manajemen memori secara manual. Dengan memahami sistem kepemilikan dan aturan peminjaman, Anda dapat menulis kode yang efisien, aman, dan bebas dari error memori.

Terbaru

  • Building a local AI agent in Workshop on Ubuntu 26.10
  • Omarchy 4.5 RC: 5 New Apps That Actually Look Useful
  • Worth It! Switching from Fedora KDE to Kubuntu
  • I’m Happy Using ‘Herdr’, The Fastest Growing Devtool written in Rust
  • Testing Goose on Omarchy Linux (App & CLI): The Open-Source Solution for Daily Task Automation
  • GNOME Founder Attacks Omarchy Founder as “Lazy, Racist, Ignorant”
  • Why I Stopped Using Plain Command Line Docker and Use Portainer 3.0 To Make My Home Projects Fun Again
  • Why I Switched to a Proper Firewall Box with OPNSense for My Homelab Stuff
  • Fixing Windows Error 0x80070005 Hyper-V Export Access Denied Error the Right Way
  • Fixing Hyper V Export Errors and Building a Better Virtual Machine Setup (error 0x80070002, 0x80070005)
  • Fixing the Dreaded Windows Audio Service Stuck on Stopping Error
  • Windows SIM Error, Unknown error 0xc1420127
  • How I’m Building a Cat Breeding Management App with Python Qt6 + Microsoft Litebox, in 1 Week
  • Why Windows Keeps Nuking Your GPU Drivers (And How to Take Back Control)
  • Why I Finally Ditched Mainstream Windows Cleaners (And Why I Use ‘Kudu’ Instead)
  • AI Made Everything Faster, Including Bad Decisions
  • Raspberry Pi Desktop Available of PC and Mac, Based on Debian 13
  • Why I Stopped Yelling at My PC When Error; Getting Windows 11 Voice Isolation and Access to Actually Work
  • Berobat Kanker ke Malaysia: Berapa Biayanya dan Apa Saja yang Perlu Disiapkan?
  • Stop Sending Every Prompt to the Biggest AI Model You Can Find
  • Stop Building AI Agents from Scratch: My Pick for the Best Native Windows Setup
  • Jev Is Faster and Cheaper, But I Still Recommend Clef. Here’s Why.
  • Weird XCP-NG Bug or Feature? Enable Maintenance Mode = Host Not Enough Memory
  • Vinix OS: Another OS That Want to Beat Linux, Try it!
  • Trying NVX, An Ultra-Light Micro-VM Sandbox from Microsoft
  • Learning NocoDB from Scratch: Creating a Simple Greenhouse App
  • How RHEL 10.2 Quietly Turned Into an Absolute Security Beast
  • Grab Videos from Anywhere with ReClip (Can Running Locally)
  • Jumped onto Ubuntu 26.04 LTS? Here’s How to Add a New User Account
  • Tutorial Cara Install WPS Office di Linux (Alternatif Microsoft Office)
  • Canonical: Ubuntu coming soon to Snapdragon X2 Series platforms
  • Finally, wolfSSL adds post-quantum algorithms!
  • How to Run Gemma Embedding Models Using Docker
  • Deploy Nginx Rootful Container with Podman
  • How to Sandboxing Browser on Linux Desktop with Flatpak
  • Building Long-Running AI Agents with Pi Durable: An AI SRE Agent Example
  • Prompt AI: Impressionist Portrait Art of a Woman
  • Prompt AI: Stylish Man Walking Double Exposure Photo
  • Trying Nemotron 3.5 Super VL: NVIDIA’s Open Multimodal Model Built for Agents That Actually See and Act
  • Pruna AI Release their Qwen-Image 2.1 LoRA Adapter, 6x Faster than Regular Qwen
  • Messi vs Ronaldo rebutan gelar Ballon d’Or of All Time, siapa yang paling jago menurut fans?
  • Ini Dia QR Link Dana Kaget 400K, 27 Oktober 2026
  • Fresh! Ini Biodata dan Fakta Unik dari Member No Na
  • Inilah Rekomendasi 10 Drama Jepang Wajib Tonton November 2026
  • Banyak yang cari link nonton gratis Adili Idola Andre Taulany, padahal sistemnya bayar per tayangan

©2026 emka.web.id | Design: Newspaperly WordPress Theme