如何将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
/ CStr
和OsString
/ 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); }