了解Rust的生命周期和借阅检查器

时间:2019-01-08 06:40:53

标签: rust

这里是生锈的新手。谁能帮助我了解为什么Rust不喜欢此代码以及如何对其进行修复?

struct Foo {
    num: u32
}

struct Bar<'a> {
    foo: Foo,
    num_ref: &'a u32,
}

fn foo<'a>() -> Bar<'a> {
    let f = Foo { num: 2 };
    let n: &'a u32 = &f.num;
    return Bar { foo: f, num_ref: n };
}

fn main() { }

我基本上想要一个返回Bar的函数,该函数拥有Foo和对num(由Foo拥有)的引用。

Link to playground

错误:

error[E0597]: `f.num` does not live long enough
  --> src/main.rs:12:23
   |
12 |     let n: &'a u32 = &f.num;
   |                       ^^^^^ borrowed value does not live long enough
13 |     return Bar { foo: f, num_ref: n };
14 | }
   | - borrowed value only lives until here
   |
note: borrowed value must be valid for the lifetime 'a as defined on the function body at 10:8...
  --> src/main.rs:10:8
   |
10 | fn foo<'a>() -> Bar<'a> {
   |        ^^

谢谢!

1 个答案:

答案 0 :(得分:2)

编译器说您正在函数范围内借用f.num,一旦完成此范围,对f.num的引用就不再有效。

我不确定this example of code是否能为您提供帮助。我不知道在您的案例中“对num的引用”是否重要,但是似乎没有必要,也许您看不到如何实现这一点。

我建议您阅读并花时间了解ownership system在Rust中的工作方式。刚开始时可能会有些乏味,但是您将通过实践掌握这一概念。