Diperbarui untuk Rust 1.0
Anda tidak dapat memperoleh &'static str
dari String
karena String
s tidak mungkin hidup untuk seluruh kehidupan dari program Anda, dan bahwa ini apa &'static
berarti seumur hidup. Anda hanya bisa mendapatkan potongan yang diparameterisasi menurut String
masa hidupnya.
Untuk beralih dari a String
ke slice, &'a str
Anda dapat menggunakan sintaks slicing:
let s: String = "abcdefg".to_owned();
let s_slice: &str = &s[..];
Atau, Anda dapat menggunakan fakta yang String
mengimplementasikan Deref<Target=str>
dan melakukan peminjaman kembali secara eksplisit:
let s_slice: &str = &*s;
Bahkan ada cara lain yang memungkinkan sintaks yang lebih ringkas tetapi hanya dapat digunakan jika kompiler dapat menentukan tipe target yang diinginkan (misalnya dalam argumen fungsi atau binding variabel yang diketik secara eksplisit). Ini disebut paksaan deref dan memungkinkan menggunakan &
operator saja , dan kompilator akan secara otomatis memasukkan jumlah yang sesuai *
berdasarkan konteks:
let s_slice: &str = &s;
fn take_name(name: &str) { ... }
take_name(&s);
let not_correct = &s;
Perhatikan bahwa pola ini tidak unik untuk String
/ &str
- Anda dapat menggunakannya dengan setiap pasangan tipe yang dihubungkan Deref
, misalnya, dengan CString
/ CStr
dan OsString
/ OsStr
dari std::ffi
modul atau PathBuf
/ Path
dari std::path
modul.
'static
masa hidup akan menyiratkan bahwa string tidak pernah dibatalkan alokasinya, yaitu kebocoran memori. Mengapa Anda membutuhkan,&'static str
bukan&'a str
untuk beberapa yang sesuai'a
?