我正在尝试编写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
的有效期内有效吗?
答案 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 }
}