Zaktualizowano dla Rust 1.0
Nie możesz uzyskać &'static strod a, Stringponieważ Strings mogą nie żyć przez całe życie twojego programu i to właśnie &'staticoznacza życie. Możesz uzyskać z niego tylko wycinek sparametryzowany przez Stringwłasny okres istnienia.
Aby przejść od a Stringdo 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 Stringimplementuje 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/ CStri OsString/ OsStrz std::ffimodułu lub PathBuf/ Pathz std::pathmodułu.
'staticżywotność oznaczałaby, że ciąg nigdy nie zostałby cofnięty, tj. wyciek pamięci. Dlaczego potrzebujesz&'static strzamiast&'a strjakiegoś odpowiedniego'a?