Rust menggunakan pemeriksa pinjaman untuk menegakkan aturan kepemilikannya dan memastikan bahwa program aman dari memori. Aturan kepemilikan menentukan bagaimana Rust mengelola memori di atas tumpukan dan tumpukan.
Saat Anda menulis program Rust, Anda harus menggunakan variabel tanpa mengubah kepemilikan nilai terkait. Rust menyediakan mekanisme peminjaman yang kuat untuk mendorong fleksibilitas dan penggunaan kembali kode.
Apa yang Meminjam di Rust?
Meminjam adalah mengakses nilai variabel tanpa mengambil kepemilikan variabel dengan merujuk pemiliknya. Pemeriksa peminjam memastikan bahwa referensi tersebut valid, dan data tidak dibuang menggunakan konstruksi yang disebut masa hidup.
Seumur hidup adalah berapa lama variabel ada. Seumur hidup dimulai pada pembuatan variabel dan diakhiri dengan penghancuran variabel. Anda dapat meminjam kepemilikan suatu variabel, dan ketika referensi yang dipinjam berada di luar cakupan, kepemilikan kembali ke variabel pemilik. Meminjam agak mirip dengan petunjuk yang akan Anda temukan dalam bahasa seperti C++ dan Go
. Tetapi kompiler Rust menggunakan pemeriksa pinjaman untuk memastikan program aman dari memori.Contoh Meminjam di Rust
Anda dapat meminjam kepemilikan suatu variabel dengan mereferensikan pemiliknya menggunakan simbol ampersand (&).
fnutama() {
membiarkan x = Rangkaian::dari("halo"); // x memiliki "halo"
membiarkan y = &x; // y referensi x, meminjam "halo"
cetak!("{}", x);
cetak!("{}", y)
}
Tanpa meminjam dengan referensi, program akan panik. Itu akan melanggar aturan kepemilikan bahwa suatu nilai dapat memiliki satu pemilik, dan dua variabel tidak dapat menunjuk ke lokasi memori yang sama. Meminjam bisa sangat berguna dalam fungsi. Berikut adalah contoh peminjaman dalam suatu fungsi, untuk mempertahankan kepemilikan saat memanggil fungsi lain yang menggunakan variabel lokal sebagai argumen.
fnprint_even(vektor: &Vec<i32>) {
untuk nilai-nilai di vektor {
jika nilai % 2 == 0 {
cetak!("{}", nilai);
}
}
}
Itu print_even fungsi mereferensikan vektor bilangan bulat 32-bit sebagai argumennya. Kemudian mencetak baris nilai yang merupakan kelipatan dua dalam vektor menggunakan for-loop dan println! makro.
fnutama() {
membiarkan bilangan_vektor = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_even(&nomor_vektor); // kepemilikan dipinjam, bukan dipindahkan
cetak!("Fungsi utama mempertahankan kepemilikan vektor angka{:?}", number_vector)
}
Fungsi utama mendeklarasikan variabel number_vector dan memberikan vektor bilangan bulat 32-bit padanya. Kemudian memanggil fungsi print_even dan meneruskannya sebagai referensi ke nomor_vektor variabel menggunakan simbol ampersand.
Fungsi utama mempertahankan kepemilikan nomor_vektor variabel itu dapat terus menggunakan nilai di lokasi memorinya.
Meminjam dan Memutasi Referensi
Fungsi juga dapat memodifikasi variabel yang dipinjam menggunakan referensi yang dapat diubah, sebelum mengembalikan kepemilikan.
Namun, tidak seperti variabel biasa yang dapat diatur agar dapat diubah menggunakan kata kunci mut, Anda harus mengawali referensi yang dapat diubah dengan simbol ampersand.
Sebelum membuat referensi yang dapat diubah, variabel yang ingin Anda ubah harus dapat diubah.
fnhapus_nilai(vektor: &mutVec<i32>) -> &Vec<i32> {
vektor.hapus(4);
kembali vektor
}
Itu hapus_nilai fungsi mengambil referensi dari vektor yang dapat berubah dari bilangan bulat 32-bit. Ini mengembalikan vektor bilangan bulat 32-bit setelah menghapus nilai vektor dalam indeks keempat.
fnutama() {
membiarkanmut angka = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
hapus_nilai(&mut angka); // referensi yang bisa berubah di sini
cetak!("{:?}", bilangan);
}
Fungsi mengubah angka vektor dengan memanggil remove_value dan meneruskan referensi vektor yang dapat diubah sebagai argumen. Saat mencetak vektor, indeks keempat vektor sebelumnya tidak ada.
Perhatikan bahwa argumen adalah referensi ke vektor yang bisa berubah.
Penting untuk Memahami Kepemilikan dan Peminjaman
Anda harus memahami kepemilikan dan peminjaman untuk menulis kode Rust yang efisien dan aman memori yang dikompilasi dan dijalankan. Jika kode Anda tidak mengikuti aturan kepemilikan, pemeriksa pinjaman akan mendeteksinya. Anda harus membuat program Anda aman dari memori agar Rust dapat mengompilasinya.
Pemeriksa pinjaman menjengkelkan ketika Anda baru mengenal Rust. Namun, saat Anda menulis lebih banyak kode Rust, Anda akan terbiasa dan mendapatkan pengalaman dalam menulis kode Rust yang aman dari memori.