首页 > 解决方案 > struct str 属性必须是引用吗?

问题描述

对于以下代码:

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结构的概念错误吗?

标签: stringstructrust

解决方案


World指的是str必须由其他东西拥有的切片。您的函数work分配一个新的String(通过get_lines),并对其进行引用(通过get_first_line)。当它返回时,String超出范围并将被删除,因此您不能保留对它的引用,因为它所引用的东西不再存在。

如果您想要一个World不依赖于String其他东西拥有的对象,则它需要拥有数据本身:包含 aString而不是 a &'a str

另请参阅Rust Book 中的“悬空引用”


推荐阅读