结构str属性必须被引用吗?

时间:2019-04-06 11:19:07

标签: string struct rust

对于以下代码:

fn get_lines() -> String {
    String::from("Hello\nWorld")
}

fn get_first_line(s: &String) -> &str {
    s.lines().next().unwrap()
}

struct World<'a> {
    a_str: &'a str,
}

fn work<'a>() -> World<'a> {
    let s1 = get_lines();
    let s2 = get_first_line(&s1);

    World { a_str: s2 }
}

fn main() {
    let w = work();
}

我遇到以下错误:

error[E0515]: cannot return value referencing local variable `s1`
  --> src/main.rs:17:5
   |
15 |     let s2 = get_first_line(&s1);
   |                             --- `s1` is borrowed here
16 | 
17 |     World { a_str: s2 }
   |     ^^^^^^^^^^^^^^^^^^^ returns a value referencing data owned by the current function

如何使用s2构建结构实例?是World结构的概念错误吗?

1 个答案:

答案 0 :(得分:1)

World指必须由其他对象拥有的str分片。您的函数work分配一个新的String(通过get_lines),并对其进行引用(通过get_first_line)。返回时,String会超出范围,将被丢弃,因此您无法保留对其的引用,因为它所引用的内容不再存在。

如果您要使用的World对象不依赖于其他对象拥有的String,则它将需要拥有数据本身:包含一个String而不是一个{{ 1}}。

另请参阅'dangling references' in the Rust Book