带串片的电池堆的 rust eclipse 寿命

omjgkv6w  于 2022-11-12  发布在  Eclipse
关注(0)|答案(3)|浏览(138)

以rustbook中的代码为例

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

我们有上面的函数,现在假设我们有main:

// can't compile , i understand this part, just post here for reference
fn main1(){
       let string1 = String::from("abcd");
        let result;
        {
            let string2 = String::from("xyz"); // we will change this to &str in next example
            result = longest(string1.as_str(), string2.as_str());
                                                ^^^^^^ doesn't compile , string2 doesn't live long enough
        }
        println!("The longest string is {}", result);
}

但是如果我们稍微修改一下下面的代码,把string2修改成一个字符串片,这段代码实际上是编译的,我不太清楚是怎么回事,“xyz”仍然算作有效内存吗?

//This compiles. but why? shouldn't ```longest()``` return a smaller lifetime and refuses to compile?
fn main2(){
    let string1 = String::from("abcd");
    let result;
    {
        let string2 = "xyz"; // <------ changed
        result = longest(string1.as_str(), string2);
    }
    println!("The longest string is {}", result);

}
k4aesqcs

k4aesqcs1#

字符串的生存期是'static(完整的类型是&'static str),这意味着它将一直生存到程序结束。这是因为字符串被作为数据放入编译后的二进制文件的一个特殊部分,所以只要程序在运行,这些数据也是可以访问的。

cwxwcias

cwxwcias2#

"xyz"&'static str,它在整个程序期间都有效。

6ojccjat

6ojccjat3#

string2总是会被删除,但在第一个例子中,string2拥有您的数据,在第二个例子中,它只是对’static数据的引用,因此在删除string2后,数据不会无效。

相关问题