簡體   English   中英

從String轉換為&str具有不同的生存期

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM