[英]Converting from String to &str with a different lifetime
我有一個簡單的例子:
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是堆分配的,所以有沒有一種方法可以從String創建引用並將其擴展到生存期'a?
這里有一個基本的誤解: String
不是堆分配的 。
String
的內容是堆分配的,但是它的生存期與String
對象本身的生存期相關,並且每當刪除String
(在make_str
的末尾), String
的內容也會被刪除。
因此,編譯器是正確的:結果的壽命String::as_slice
小於或等於的String
和壽命String
結束與功能......所以你不能引用返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.