使用不同的生命周期从String转换为& str

时间:2014-12-03 15:05:02

标签: string rust lifetime

我有一个简单的例子:

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是堆分配的?

1 个答案:

答案 0 :(得分:2)

这里存在一个根本的误解:String 未分配堆

String内容是堆分配的,但其生命周期与String对象本身的生命周期相关,并且每当String被删除时(在make_str)结束时,String的内容也会被删除。

因此,编译器是正确的:结果String::as_slice的生命周期小于或等于String的生命周期,String的生命周期以函数结束...因此你无法返回对它的引用。