2015-10-10 69 views
0

我不知道如何正確地標題這篇文章。我對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結構的生命週期中?

我在這裏錯過了什麼?

回答

3

您必須指定要返回參考系在壽命'a,而不是自我的壽命是編譯器會推斷您:

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返回,但我不知道如何將其綁定到Foo結構體的生命週期中 ?

在這種情況下,Foo的壽命根本不重要。