Zaktualizowano dla Rust 1.0
Nie możesz uzyskać &'static str
od a, String
ponieważ String
s mogą nie żyć przez całe życie twojego programu i to właśnie &'static
oznacza życie. Możesz uzyskać z niego tylko wycinek sparametryzowany przez String
własny okres istnienia.
Aby przejść od a String
do plasterka &'a str
, możesz użyć składni krojenia:
let s: String = "abcdefg".to_owned();
let s_slice: &str = &s[..];
Alternatywnie możesz użyć faktu, że String
implementuje Deref<Target=str>
i przeprowadza jawne ponowne pożyczanie:
let s_slice: &str = &*s;
Istnieje nawet inny sposób, który pozwala na jeszcze bardziej zwięzłą składnię, ale można go użyć tylko wtedy, gdy kompilator jest w stanie określić żądany typ docelowy (np. W argumentach funkcji lub jawnie wpisanych wiązaniach zmiennych). Nazywa się to deref coercion i pozwala na użycie tylko &
operatora, a kompilator automatycznie wstawi odpowiednią ilość *
s na podstawie kontekstu:
let s_slice: &str = &s;
fn take_name(name: &str) { ... }
take_name(&s);
let not_correct = &s;
Zauważ, że ten wzorzec nie jest unikalny dla String
/ &str
- możesz go użyć z każdą parą typów, które są połączone Deref
, na przykład z CString
/ CStr
i OsString
/ OsStr
z std::ffi
modułu lub PathBuf
/ Path
z std::path
modułu.
'static
żywotność oznaczałaby, że ciąg nigdy nie zostałby cofnięty, tj. wyciek pamięci. Dlaczego potrzebujesz&'static str
zamiast&'a str
jakiegoś odpowiedniego'a
?