Rust 程式設計影片教程(進階)——004_2 函式和結構體中的生命週期

linghuyichong發表於2020-01-12

頭條地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/

1、函式中的泛型生命週期

錯誤例子:

fn longest(x: &str, y: &str) -> &str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

fn main() {
    let s1 = String::from("abcd");
    let s2 = String::from("ad");
    let r = longest(s1.as_str(), s2.as_str());
}

錯誤原因:rust的借用檢查器不知道x和y的生命週期和返回值的生命週期是如何相關聯的。

生命週期的語法: ’a
將上述函式修正:

fn longest<’a>(x: &‘a str, y: &’a str) -> &‘a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

//上述函式中,所有的引用擁有相同的生命週期。當不遵守這個規則的引數傳入時,檢查器就會報錯。

2、注意的點
(1)例子:

fn longest<'a>(x: &‘a str, y: &str) -> &‘a str {
    x
}

如果返回值總是x,則不需要為y指定生命週期

(2)當從函式返回一個引用,返回值的生命週期引數需要與一個引數的生命週期引數相匹配。如果返回的引用沒有指向任何一個引數,那麼唯一的可能就是它指向一個函式內部建立的值,它將會是一個懸垂引用。
錯誤例子:

fn a_string<'a>(x: & str, y: &str) -> &‘a str {
    let r = String::from("a string");
    r.as_str()//返回懸垂引用,報錯
}

3、結構體中的生命週期。包含引用的結構體,需要為結構體定義中新增生命週期註解。

#[derive(Debug)]
struct A<'a> {
    name: &'a str,
}
fn main() {
    let n = String::from("andy");
    let a = A{ name: &n};
    println!("{:#?}", a);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章