2014-12-03 47 views
0

我有這樣的簡單的例子:從字符串轉換爲&STR具有不同壽命

fn make_string<'a>() -> &'a str { 
    let s : &'static str = "test"; 
    s 
} 

fn make_str<'a>() -> &'a str { 
    let s : String = String::from_str("test"); 
    s.as_slice() 
} 

fn main() { 
    println!("{}", make_string()); 
    println!("{}", make_str()); 
} 

錯誤消息:

<anon>:8:9: 8:10 error: `s` does not live long enough 
<anon>:8   s.as_slice() 
       ^
<anon>:6:34: 9:6 note: reference must be valid for the lifetime 'a as defined on the block at 6:33... 
<anon>:6  fn make_str<'a>() -> &'a str { 
<anon>:7   let s : String = String::from_str("test"); 
<anon>:8   s.as_slice() 
<anon>:9  } 
<anon>:6:34: 9:6 note: ...but borrowed value is only valid for the block at 6:33 
<anon>:6  fn make_str<'a>() -> &'a str { 
<anon>:7   let s : String = String::from_str("test"); 
<anon>:8   s.as_slice() 
<anon>:9  } 
error: aborting due to previous error 
playpen: application terminated with error code 101 
Program ended. 

看來,借檢查識別出「靜止大於a壽命'所以make_string的轉換工作,但make_str失敗。有沒有辦法從String創建一個引用並將其擴展到生命週期'a,因爲String是堆分配?

+0

可能重複[爲什麼我不能返回從字符串生成的&str值?](http://stackoverflow.com/questions/29781331/why-cant-i-return-an-str-value-generated -from-a-string) – malbarbo 2016-05-26 22:12:58

回答

2

這裏有一個根本的誤解:String不是堆分配

內容的String被堆上分配,但其壽命是聯繫在一起的String對象本身的壽命,並且每當String被丟棄(在此,在make_str)結束時,接着的String內容被丟棄太。

因此,編譯器是正確的:結果String::as_slice的壽命小於或等於的StringString壽命與函數結束......所以你不能引用返回。

+0

相關問題,比如說我在一個對象的方法中創建了一個字符串,我想要設置對象的字段並返回字符串。如果我返回字符串它將轉讓所有權,這是不允許的,因爲該字段也是如此。有沒有辦法做到這一點,而不克隆字符串? – noisecapella 2014-12-03 19:48:09

+0

@noisecapella:你應該[發表一個新問題](http://stackoverflow.com/questions/ask)。請記住,堆棧溢出不是一個討論論壇。 :) – 2014-12-04 00:42:55

相關問題