如何将string转换为&'静态str

我不知道如何将一个String (以前的StrBuf )转换成一个&str 。 更具体地说,我想把它转换成一个具有静态生命周期的str( &'static str

更新了Rust 1.0

你不能从String获得&'static str ,因为String不能在你的程序的整个生命周期中生存,这就是&'static生命周期&'static含义。 你只能得到一个由它自己的生命周期参数化的切片。

要从一个String切换到一个切片&'a str可以使用切片语法:

 let s: String = "abcdefg".to_owned(); let s_slice: &str = &s[..]; // take a full slice of the string 

或者,您可以使用String实现Deref<Target=str>并执行显式重新借贷的事实:

 let s_slice: &str = &*s; // s : String // *s : str (via Deref<Target=str>) // &*s: &str 

甚至有另外一种方法允许更简洁的语法,但只有在编译器能够确定所需的目标types(例如在函数参数或显式types的variables绑定)时才能使用它。 它被称为deref强制 ,它允许使用&运算符,编译器将根据上下文自动插入适当的* s:

 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 

请注意,此模式对于String / &str不是唯一的 – 您可以将它与通过Deref连接的每对types(例如,来自std::ffi模块的CString / CStrOsString / OsStr或来自std::path PathBuf / Path std::path模块。

你可以泄漏String的内存,通过这个保证,内存永远不会被释放。 因此,对内部对象的任何引用都可以被解释为具有'static生命周期”。

 use std::mem; fn string_to_static_str(s: String) -> &'static str { unsafe { let ret = mem::transmute(&s as &str); mem::forget(s); ret } } fn main() { let mut s = String::new(); std::io::stdin().read_line(&mut s).unwrap(); let s: &'static str = string_to_static_str(s); }