Rust-结构成员的生存期取决于另一个结构成员

时间:2019-07-04 17:47:52

标签: rust lifetime

我正在尝试编写Rust结构。该结构拥有引用计数的指向字符串的指针,还拥有指向相同字符串的字符串切片的向量。

此外,我正在尝试编写一个函数来生成此结构。我不确定如何进行。

struct MyStruct<'a> {
    rc_string: Rc<String>,
    vec: Vec<&'a str>
}

fn build_my_struct<'a>(s: &Rc<String>) -> MyStruct<'a> {
    let rc_string = s.clone();
    let mut vec = Vec::new();
    vec.push(&rc_string[0..2]);

    MyStruct {
        rc_string: rc_string,
        vec: vec
    }
}
error[E0515]: cannot return value referencing local variable `rc_string`
  --> src/main.rs:13:5
   |
11 |       vec.push(&rc_string[0..2]);
   |                 --------- `rc_string` is borrowed here
12 | 
13 | /     MyStruct {
14 | |         rc_string: rc_string,
15 | |         vec: vec
16 | |     }
   | |_____^ returns a value referencing data owned by the current function

我了解到vec变量借用了rc_string。编译器不喜欢返回vec,因为它具有对局部变量rc_string的借用。

但是还返回了rc_string吗?字符串切片在MyStruct.rc_string的有效期内有效吗?

1 个答案:

答案 0 :(得分:1)

您还需要终身借用Rc 'a。编译器需要知道来自String的切片是否位于'a中。在这种情况下,我们需要为Rc借用'a,编译器将知道Rc的内部也将存在于'a中。

如果您克隆s并将其分配给rc_string

  • s将在借用Rc的整个生命周期'a内停留在功能范围内
  • rc_string将是Rc 指针
  • 的所有者

并且编译器将无法知道rc_string的一部分是否生存'a

使用s中的切片将起作用:

fn build_my_struct<'a>(s: &'a Rc<String>) -> MyStruct<'a> {
    let mut vec = Vec::new();
    let rc_string = s.clone();

    vec.push(&s[0..2]);

    MyStruct { rc_string, vec }
}

Playground

相关问题