< 返回版块

青鱼🐟 发表于 2020-01-09 20:40

Tags:生命周期,lifetime,问答

请看下面两段代码

fn strcmp<'a>(a: &'a str, b: &'a str) -> &'a str {
    if a.len() > b.len() {
        a
    } else {
        b
    }
}

fn main() {
    let a = "abc";
    let result;
    {
        let b = "abc";
        result = strcmp(&a, &b);
    }   //             compile successful
    let a : String;
    println!("{}", result);
}

上面这一段代码可以编译成功

fn strcmp<'a>(a: &'a str, b: &'a str) -> &'a str {
    if a.len() > b.len() {
        a
    } else {
        b
    }
}

fn main() {
    let a = String::from("abc");
    let result;
    {
        let b = String::from("abc");
        result = strcmp(&a, &b);
    }   //                  ^^ borrowed value does not live long enough      

    println!("{}", result);
}

这一段代码编译失败,提示生命周期错误。

这两种情况让我非常困惑,希望各位大佬指教。谢谢。

评论区

写评论
woodstock-xkx 2020-01-10 13:24

你理解错了,b的生命周期是 static,不代表 &str 的默认周期是 static。 只不过,b是 string literal,比较特殊罢了。 对以下内容的回复:

作者 青鱼🐟 2020-01-09 22:57

明白了,&str的默认周期是 static。

对以下内容的回复:

simoin 2020-01-09 22:18

第一段的 b 是一个 string literal,生命周期为 static。

1 共 3 条评论, 1 页