【问题标题】:Converting from String to &str with a different lifetime使用不同的生命周期从 String 转换为 &str
【发布时间】: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 是堆分配的?

【问题讨论】:

标签: string rust lifetime


【解决方案1】:

这里有一个基本的误解:String没有分配堆

String内容 是堆分配的,但它的生命周期与 String 对象本身的生命周期相关,并且每当删除 String 时(这里,在make_str),那么String的内容也被删除了。

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

【讨论】:

  • 相关问题,假设我在对象的方法中创建了一个字符串,我想设置对象的字段并返回字符串。如果我返回字符串,它将转移所有权,这是不允许的,因为该字段也有它。有没有办法在不克隆字符串的情况下做到这一点?
  • @noisecapella:你应该post a new question。请记住,Stack Overflow 不是一个讨论论坛。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多