我不确定如何正确标题这篇文章。我对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
中的实际参考。这有关系吗?
我的一部分感觉我需要指定从&Bar
返回的get_bar
的生命周期,但我不知道如何将其与{{1}的生命周期联系起来结构?
我在这里缺少什么?
答案 0 :(得分: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 }
}
部分我觉得我应该指定&amp; Bar的生命周期 从get_bar返回,但我不知道如何将其绑定到 Foo结构的生命周期?
在这种情况下,Foo
的生命周期根本不重要。