首页 > 解决方案 > 如何计算函数的输出寿命?

问题描述

在 Rust 书(https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html)中,此代码用作示例(释义):

fn main() {
    let string1 = String::from("long string is long");
    {
        let string2 = String::from("xyz");
        let result = longest(string1.as_str(), string2.as_str()); // line 5 
        println!("The longest string is {}", result);  // line 6
    }
}

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

我很困惑为什么这段代码可以编译。

关于longest函数,书中说,“通用生命周期 'a 将获得等于 x 和 y 生命周期中较小者的具体生命周期”。

这本书然后说话好像string1.as_str()string2.as_str()寿命一样长string1string2分别。但他们为什么会呢?这两个引用在第 5 行之后没有使用,到了第 6 行,它们应该已经死了。为什么在第 6 行使用不再存在的结果时没有错误?

有人可以说存在以result某种方式延长了输入寿命,但这不会与“输出寿命是输入寿命的交集”的概念相矛盾吗?

我在哪里弄错了?

标签: rustlifetime

解决方案


但他们为什么会呢?这两个引用在第 5 行之后没有使用,到了第 6 行,它们应该已经死了。

但他们并没有死。事实上,其中一个肯定在result第 6 行中并且正在使用。引用至少可以持续到当前表达式的结尾(通常,但不总是,直到分号),最长只要它指向的东西继续存在。的输出中的生命周期参数要求它在范围内longest持续。result值得注意的是, 的范围result不大于string1or的范围string2,所以没有问题。如果我们试图将 的结果分配longest给一个超过 的变量string2,那么我们就会遇到问题。例如,这不会编译。

fn main() {
    let string1 = String::from("long string is long");
    let mut result = "";
    {
        let string2 = String::from("xyz");
        result = longest(string1.as_str(), string2.as_str());
    }
    println!("The longest string is {}", result);
}

因为那将需要result寿命string2,这是一个问题。


推荐阅读