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 heapRc<T>, sebuah tipe reference counting yang memungkinkan kepemilikan ganda (multiple ownership)Ref<T>danRefMut<T>, yang diakses melaluiRefCell<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!