首页 文章

结构必须比成员参考更长久

提问于
浏览
0

我不确定如何正确地 Headers 这篇文章 . 我对Rust很新,并试图按照这个简单的结构编译程序,但它似乎是不正确的,我不知道为什么 .

struct Bar;

impl Bar {
    fn do_thing(&self) { println!("Ha, do nothing!") }
}

struct Foo<'a> {
    bar: &'a Bar
}

impl<'a> Foo<'a> {
    fn new(b: &Bar) -> Foo { Foo { bar: b } }
    fn get_bar(&self) -> &Bar { self.bar }
}

fn main() {
    let b = Bar;
    let b_ref = {
        let f = Foo::new(&b);
        f.get_bar()
    };
    b_ref.do_thing();
}

这里的编译器错误声称 f 的寿命不够长 . 不管 f 生活多久都没关系 b_ref 只要 b 有效,我认为引用是 Copy 所以我们不必担心 f 中的实际引用 . 这有关系吗?

我的一部分感觉我需要指定从 get_bar 返回的 &Bar 的生命周期,但我不知道如何将其与 Foo 结构的生命周期联系起来?

我在这里错过了什么?

1 回答

  • 3

    您必须指定要返回的引用与生命周期 'a 相关联,而不是编译器将为您推断的self的生命周期:

    impl<'a> Foo<'a> {
        fn new(b: &Bar) -> Foo { Foo { bar: b } }
        fn get_bar(&self) -> &'a Bar { self.bar }
    }
    

    这相当于原始代码:

    impl<'a> Foo<'a> {
        fn new(b: &Bar) -> Foo { Foo { bar: b } }
        fn get_bar<'b>(&'b self) -> &'b Bar { self.bar }
    }
    

    部分我觉得我应该指定从get_bar返回的&Bar的生命周期,但我不知道如何将其与Foo结构的生命周期联系起来?

    在这种情况下, Foo 的生命周期根本不重要 .

相关问题