Apa jenis Rust yang dilambangkan dengan satu apostrof?

94

Saya telah menemukan sejumlah jenis di Rust yang dilambangkan dengan satu apostrof:

'static
'r
'a

Apa pentingnya apostrof itu? Mungkin itu pengubah referensi ( &)? Pengetikan umum khusus untuk referensi? Saya tidak tahu di mana dokumentasi untuk ini bersembunyi.

Greg Malcolm
sumber
Tautan di komentar sebelumnya tidak lagi berfungsi. Saya tidak tahu apakah ini setara: doc.rust-lang.org/book/lifetimes.html
Ellen Spertus
Tautan Ellen juga berhenti berfungsi - inilah yang baru (per Juni 2019): doc.rust-lang.org/book/ch10-03-lifetime-syntax.html

Jawaban:

75

Ini adalah masa hidup yang dinamai Rust.

Mengutip dari The Rust Programming Language :

Setiap referensi di Rust memiliki masa hidup, yang merupakan cakupan yang valid untuk referensi tersebut. Sebagian besar masa pakai waktu bersifat implisit dan disimpulkan, sama seperti sebagian besar jenis waktu yang disimpulkan. Mirip dengan ketika kita harus membuat anotasi tipe karena beberapa tipe dimungkinkan, ada kasus di mana masa hidup referensi dapat dikaitkan dalam beberapa cara berbeda, jadi Rust membutuhkan kita untuk membuat anotasi hubungan menggunakan parameter seumur hidup generik sehingga dapat memastikan referensi aktual yang digunakan saat runtime pasti akan valid.

Anotasi seumur hidup tidak mengubah berapa lama referensi yang terlibat ada. Dengan cara yang sama bahwa fungsi dapat menerima tipe apa pun ketika tanda tangan menentukan parameter tipe generik, fungsi dapat menerima referensi dengan masa pakai apa pun saat tanda tangan menentukan parameter seumur hidup generik. Apa yang dilakukan anotasi seumur hidup adalah menghubungkan masa pakai beberapa referensi satu sama lain.

Anotasi seumur hidup memiliki sintaks yang sedikit tidak biasa: nama parameter seumur hidup harus dimulai dengan tanda kutip '. Nama parameter masa pakai biasanya semuanya huruf kecil, dan seperti tipe umum, namanya biasanya sangat pendek. 'aadalah nama yang digunakan kebanyakan orang sebagai default. Anotasi parameter seumur hidup berada setelah &referensi, dan spasi memisahkan anotasi seumur hidup dari jenis referensi.

Dengan kata lain, seumur hidup mendekati rentang eksekusi selama data yang dirujuk menjadi valid. Kompilator Rust akan secara konservatif menyimpulkan masa pakai sesingkat mungkin agar aman. Jika Anda ingin memberi tahu compiler bahwa masa pakai referensi lebih lama daripada perkiraan terpendek, Anda dapat menamainya, dengan mengatakan bahwa referensi keluaran, misalnya, memiliki masa pakai yang sama dengan referensi masukan yang diberikan.

The 'staticseumur hidup adalah seumur hidup khusus, paling lama hidup dari semua masa hidup - untuk durasi program. Contoh tipikal adalah string "literals" yang akan selalu tersedia selama masa pakai program / modul.

Anda bisa mendapatkan lebih banyak informasi dari dek slide ini , mulai sekitar slide 29.

Lifetimes in Rust juga membahas masa hidup secara mendalam.

quux00
sumber
0

Untuk menambah jawaban yang sangat baik dari quux00, masa pakai bernama juga digunakan untuk menunjukkan asal dari variabel pinjaman yang dikembalikan ke kompilator karat.

Fungsi ini

pub fn f(a: &str, b: &str) -> &str {
  b
}

tidak akan dikompilasi karena mengembalikan nilai pinjaman tetapi tidak menentukan apakah ia meminjamnya dari aatau b.

Untuk memperbaikinya, Anda akan mendeklarasikan masa pakai bernama dan menggunakan masa pakai yang sama untuk bdan jenis kembalian:

pub fn f<'r>(a: &str, b: &'r str) -> &'r str {
//      ----              ---         ---
  b
}

dan gunakan seperti yang diharapkan

f("a", "b")
Nino Filiu
sumber