根据The Rust Programming Language:

由于作用域总是嵌套的,所以另一种说法是,通用生命周期 'a将获得等于xy生命周期 中较小者的具体生命周期 .

fn main() {
    let x = "abcd";
    let result;
    {
        let y = "qwerty";
        result = longest(x, y);
    }
    println!("The longest string is {}  ", result);

}

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

在主函数中,"x和y的生命周期 中较小者"是嵌套范围.这也应该是result中值的生存期,但结果包含该嵌套范围之外的正确值.

为什么这段代码工作正常?

推荐答案

这只适用于从borrow 局部变量导出的生命周期.在本例中,相关的生存期是字符串数据的生存期,对于字符串文本,它是'static.换句话说,&strs指向存储在其他地方的数据(特别是静态数据段中的数据),因此它们根本不与堆栈生命周期 交互.

如果我们稍微改变一下这个例子,我们就可以诱导你预期的行为:

fn main() {
    let x = "abcd";
    let result;
    {
        let y = "qwerty";
        result = longest(&x, &y);
    }
    println!("The longest string is {}  ", result);

}

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

无法通过以下方式编译:

error[E0597]: `y` does not live long enough
  --> src/main.rs:6:35
   |
6  |             result = longest(&x, &y);
   |                                   ^ borrowed value does not live long enough
7  |         }
   |         - `y` dropped here while still borrowed
...
10 |     }
   |     - borrowed value needs to live until here

这是失败的,因为我们所说的now个借来的数据被放入堆栈中.

Rust相关问答推荐

使用Rust s serde_json对混合数据类型进行优化'

如何从接收&;self的方法克隆RC

如何将元素添加到向量并返回对该元素的引用?

使用模块中的所有模块,但不包括特定模块

当第二个`let`依赖于第一个`let()`时,如何在一行中有多个`let()`?

在Rust中声明和定义一个 struct 体有什么区别

如何在Rust中缩短数组

rust中的库插件管理器,现在是否可行?

获取已知数量的输入

找不到 .has_func 或 .get_func 的 def

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

为什么不能在 Rust 中声明静态或常量 std::path::Path 对象?

如何在 Rust 的 Hyper 异步闭包中从外部范围正确读取字符串值

在 Rust 中使用 `SecTrustSettingsSetTrustSettings` 绑定导致 `errSecInternalComponent`

在 Rust 中,Weak 如何知道内部值何时被删除?

为什么具有 Vec 变体的枚举没有内存开销?

我如何将 google_gmail1::Gmail> 传递给线程生成?

是否有适当的方法在参考 1D 中转换 2D 数组

如何用另一个变量向量置换 rust simd 向量?

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?