Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Smart Pointers

Pointer (penunjuk) adalah sebuah konsep umum buat sebuah variabel yang mengandung sebuah alamat di memori. Alamat ini merujuk ke, atau “menunjuk ke,” data lain. Jenis pointer yang paling umum di Rust adalah sebuah referensi, yang udah kita pelajari di Bab 4. Referensi ditandai oleh simbol & dan meminjam (borrow) nilai yang mereka tunjuk. Mereka tidak punya kemampuan spesial apa-apa selain cuma merujuk ke data, dan mereka tidak punya biaya overhead.

Smart pointers (penunjuk pintar), di sisi lain, adalah struktur data yang bertindak seperti sebuah pointer tapi juga punya metadata dan kemampuan tambahan. Konsep smart pointers ini bukan cuma ada di Rust: smart pointers asalnya dari C++ dan ada di bahasa pemrograman lain juga. Rust punya berbagai macam smart pointers yang didefinisikan di standard library yang menyediakan fungsionalitas lebih dari sekadar apa yang disediakan oleh referensi biasa. Buat mengeksplorasi konsep umumnya, kita bakal melihat beberapa contoh smart pointers yang berbeda, termasuk tipe smart pointer reference counting (penghitungan referensi). Pointer ini memungkinkan kita buat membiarkan sebuah data punya banyak pemilik (owners) dengan melacak (keeping track of) jumlah pemilik yang ada dan, saat tidak ada pemilik yang tersisa, membersihkan (cleaning up) datanya.

Rust, dengan konsep ownership dan borrowing-nya, punya perbedaan tambahan antara referensi dan smart pointers: walaupun referensi cuma meminjam data, di banyak kasus smart pointers memiliki (own) data yang mereka tunjuk.

Smart pointers biasanya diimplementasikan memakai structs. Tidak seperti struct biasa, smart pointers mengimplementasikan trait Deref dan Drop. Trait Deref memungkinkan sebuah instance dari struct smart pointer berperilaku seperti sebuah referensi sehingga kita bisa menulis kode yang bisa bekerja buat referensi maupun buat smart pointers. Trait Drop memungkinkan kita buat mengkustomisasi kode yang bakal dijalankan saat sebuah instance dari smart pointer keluar dari scope. Di bab ini, kita bakal membahas kedua trait tersebut dan mendemonstrasikan kenapa mereka itu penting buat smart pointers.

Mengingat kalau smart pointer itu adalah sebuah desain pola yang umum dan sering sekali dipakai di Rust, bab ini tidak akan membahas setiap smart pointer yang pernah ada. Banyak libraries punya smart pointers mereka sendiri, dan kita bahkan bisa bikin smart pointer kita sendiri. Kita bakal membahas smart pointers yang paling umum di standard library:

  • Box<T>, buat mengalokasikan nilai di heap
  • Rc<T>, sebuah tipe reference counting yang memungkinkan kepemilikan ganda (multiple ownership)
  • Ref<T> dan RefMut<T>, yang diakses melalui RefCell<T>, sebuah tipe yang menerapkan (enforces) aturan borrowing saat runtime ketimbang pas compile time

Selain itu, kita bakal ngebahas desain pola interior mutability (mutabilitas interior) di mana sebuah tipe yang immutable (tidak bisa diubah) mengekspos sebuah API buat memutasi nilai internalnya. Kita juga bakal ngebahas siklus referensi (reference cycles): gimana mereka bisa membocorkan memori (leak memory) dan gimana cara mencegahnya.

Mari kita selami!