我有一个简单的例子:
fn make_string<'a>() -> &'a str {
let s : &'static str = "test";
s
}
fn make_str<'a>() -> &'a str {
let s : String = String::from_str("test");
s.as_slice()
}
fn main() {
println!("{}", make_string());
println!("{}", make_str());
}
错误讯息:
<anon>:8:9: 8:10 error: `s` does not live long enough
<anon>:8 s.as_slice()
^
<anon>:6:34: 9:6 note: reference must be valid for the lifetime 'a as defined on the block at 6:33...
<anon>:6 fn make_str<'a>() -> &'a str {
<anon>:7 let s : String = String::from_str("test");
<anon>:8 s.as_slice()
<anon>:9 }
<anon>:6:34: 9:6 note: ...but borrowed value is only valid for the block at 6:33
<anon>:6 fn make_str<'a>() -> &'a str {
<anon>:7 let s : String = String::from_str("test");
<anon>:8 s.as_slice()
<anon>:9 }
error: aborting due to previous error
playpen: application terminated with error code 101
Program ended.
借用检查程序似乎认识到静态的生命周期比“a”更长,因此make_string的转换有效,但make_str失败。有没有办法从String创建引用并将其扩展到生命周期&#39; a,因为String是堆分配的?
答案 0 :(得分:2)
这里存在一个根本的误解:String
未分配堆。
String
的内容是堆分配的,但其生命周期与String
对象本身的生命周期相关,并且每当String
被删除时(在make_str
)结束时,String
的内容也会被删除。
因此,编译器是正确的:结果String::as_slice
的生命周期小于或等于String
的生命周期,String
的生命周期以函数结束...因此你无法返回对它的引用。