【发布时间】:2015-02-01 05:02:24
【问题描述】:
我有一个简单的例子:
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.
借用检查器似乎认识到 'static 的生命周期比 'a 更长,因此 make_string 的转换有效,但 make_str 失败。有没有办法从 String 创建引用并将其扩展到生命周期 'a,因为 String 是堆分配的?
【问题讨论】: