學習 Rust:生命的第 18 天

https://shafinmurani.medium.com/day-18-of-learning-rust-lifetimes-f40c09f81340

學習 Rust 的第 18 天:壽命

通用壽命標註

Rust 中的通用壽命標註允許函數接受具有任何壽命的引用,提供了處理不同壽命引用的靈活性。

Rust 中的通用壽命標註由’a、’b 或其他有效的壽命標識符表示。

這些標註指定函數或結構可以接受具有任何壽命的引用。

壽命標註通常用於指示返回引用的壽命將與最短壽命的輸入引用相同。

通用壽命標註為在同一函數或數據結構中處理具有不同壽命的引用提供了靈活性。

它們通過強制在函數或結構中使用的引用在其各自壽命的整個期間內有效,來確保內存安全。

在函數中,通用壽命標註放置在參數列表之前,表示函數可以接受具有任何有效壽命的引用。

返回引用的壽命是根據輸入引用的壽命和指定的通用壽命標註來推斷的。

範例

示例程式碼

主函數是程序的入口點。

在主函數內部創建並初始化了三個 String 變數(string1、string2 和 string3)。

聲明一個可變變數 result,它將稍後保存 longest_string 函數的結果。

在由大括號{}界定的新範圍內,另一個 String 變數 string3 被創建並初始化為值“from Rust!”。

調用 longest_string 函數,將對 string1、string2 和 string3 的引用作為參數傳遞。

longest_string 函數接受三個字符串引用(&str)並返回其中最長字符串的引用。它使用通用壽命標註’a 來指定所有輸入引用和返回的引用必須具有相同的壽命。

在 longest_string 內部,比較輸入字串(s1、s2 和 s3)的長度,並返回最長的引用。

回到 main,將 longest_string 返回的引用分配給 result 變數。

最後,println!宏打印結果,即 string1、string2 和 string3 中最長的字符串,由它們的長度決定。

輸出

最長的字符串是:from Rust!

讓我們看一些易出錯的代碼以更好地理解壽命標註

主函數嘗試調用結果函數並將返回的值存儲在變數 x 中。

result 函數嘗試返回從 String(y)創建的字符串片段(&str)的引用。

但是,y 是一個位於本地範圍的 String 變數,將在結束 result 函數時被解除分配,使引用無效。

這導致壽命錯誤,因為函數試圖返回一個引用到在函數結束時超出範圍的數據。

y.as_str()

返回引用當前函數擁有的數據
`y`在這借用了

為了解決這個問題,我們可以返回一個擁有的字符串,而不是一個字符串片段的引用,做法如下:

fn main(){
let x = result();
println!(“{}”, x);
}

fn result() -> String {
let y = String::from(“Hello”);
y
}

via Rust on Medium

March 25, 2024 at 12:36AM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *