Aktualisiert für Rust 1.0
Sie können nicht &'static strvon a erhalten, Stringweil Strings möglicherweise nicht für das gesamte Leben Ihres Programms lebt, und das ist, was &'staticLeben bedeutet. Sie können nur ein Slice erhalten, das nach seiner Stringeigenen Lebensdauer parametrisiert ist.
Um von einem Stringzu einem Slice zu wechseln &'a str, können Sie die Slicing-Syntax verwenden:
let s: String = "abcdefg".to_owned();
let s_slice: &str = &s[..]; // take a full slice of the string
Alternativ können Sie die Tatsache verwenden, dass eine explizite Neuausleihe Stringimplementiert Deref<Target=str>und durchgeführt wird:
let s_slice: &str = &*s; // s : String
// *s : str (via Deref<Target=str>)
// &*s: &str
Es gibt noch einen anderen Weg, der eine noch präzisere Syntax ermöglicht, der jedoch nur verwendet werden kann, wenn der Compiler den gewünschten Zieltyp bestimmen kann (z. B. in Funktionsargumenten oder explizit typisierten Variablenbindungen). Es wird als Deref-Zwang bezeichnet und ermöglicht die Verwendung eines einfachen &Operators. Der Compiler fügt automatisch eine geeignete Menge von *s ein, basierend auf dem Kontext:
let s_slice: &str = &s; // okay
fn take_name(name: &str) { ... }
take_name(&s); // okay as well
let not_correct = &s; // this will give &String, not &str,
// because the compiler does not know
// that you want a &str
Beachten Sie, dass dieses Muster nicht eindeutig für String/ ist. &strSie können es für jedes Typenpaar verwenden, das Derefbeispielsweise mit CString/ CStrund OsString/ OsStrvom std::ffiModul oder PathBuf/ Pathvom std::pathModul verbunden ist.
'staticDie Lebensdauer würde bedeuten, dass die Zeichenfolge niemals freigegeben wird, dh ein Speicherverlust. Warum brauchst du&'static strstatt&'a strfür ein passendes'a?