2014-01-20 31 views
2

我有一個關於Rust編程語言中的可變壽命的問題。鏽的生命期和調用成員函數

createTest函數創建並返回r值引用。當它返回一個引用時,testValue被銷燬。但test.print()不會導致崩潰。爲什麼?

(被稱爲靜態函數測試::打印功能?)

代碼

struct Test;               
impl Drop for Test {              
    fn drop (&mut self) {              
    println("Dropped.");             
    }                   
}                   

impl Test {                 
    fn print(&self) { println!("Print!"); }         
}                   

fn createTest() -> &Test {             
    let testValue = &Test;             
    return testValue;               
}                   

fn main() {                 
    let test = createTest();            
    test.print();                
    println("Test");               
} 

結果

Dropped. 
Print! 
Test 

回答

3

代碼編譯的原因是因爲使用了單元結構(即沒有字段)的,基本上等同於:

struct Test; 

static TestStatic: Test = Test; 

fn createTest() -> &Test { 
     &TestStatic 
} 

這樣一來,&TestStatic表達具有類型&'static Test每個有效期是'static的子壽命,包括-> &Test的隱式匿名壽命,因此您可以返回'static

此行爲是由兩個錯誤覆蓋:


這就是說,它是非常奇怪,Drop運行這樣的,所以謝謝備案11681

1

這看起來像我的錯誤。

struct Test { 
    x: int 
} 

impl Drop for Test { 
    fn drop (&mut self) { 
    println("Dropped."); 
    } 
} 

impl Test { 
    fn print(&self) { println!("Print: {}", self.x); } 
} 

fn createTest() -> &Test { 
    let testValue = &Test{ x: 10 }; 
    testValue 
} 

fn main() { 
    let test = createTest(); 
    test.print(); 
    println("Test"); 
} 

錯誤消息:你的榜樣的簡單延伸不絕然錯誤消息編譯

main.rs:16:19: 16:24 error: borrowed value does not live long enough 
main.rs:16 let testValue = &Test{ x: 10 }; 
          ^~~~~ 
main.rs:15:26: 18:2 note: reference must be valid for the anonymous lifetime #1 defined on the block at 15:25... 
main.rs:15 fn createTest() -> &Test { 
main.rs:16 let testValue = &Test{ x: 10 }; 
main.rs:17 testValue 
main.rs:18 } 
main.rs:15:26: 18:2 note: ...but borrowed value is only valid for the block at 15:25 
main.rs:15 fn createTest() -> &Test { 
main.rs:16 let testValue = &Test{ x: 10 }; 
main.rs:17 testValue 
main.rs:18 } 

順便說一句,你不必寫return當你想從返回的東西函數,除非它是一個早期返回(例如從循環內部)。在最後的聲明中,請留下分號。