rust - 如果它的生命周期与其内容相同,为什么我不能两次使用对 Vec 的可变引用?

标签 rust lifetime

<分区>

struct A;

fn y<'r>(a: &'r mut Vec<&'r A>) {}

fn x<'r>(a: &'r mut Vec<&'r A>) {
    y(a);
    y(a);
}

这段代码编译失败,表示 *a不能被第二次可变地借用。当我使签名看起来像这样时 (a: &'a mut Vec<&A>) ,即从 Vec 的引用中删除生命周期s 的内容,它编译得很好。

为什么原始代码无法编译?我在这里看不到问题。对我来说,关于矢量及其内容的生命周期意味着该矢量及其内容只存在相同的“时间”。我哪里错了?

最佳答案

在这个函数中:

fn y<'r>(a: &'r mut Vec<&'r A>) {}

你问的是 &A与对 Vec 的(可变)引用具有相同的生命周期.如果引用不可变,你会问 &A 的生命周期比对向量的引用更长寿,不会有问题。然而,可变性使得生命周期不变

在这个函数中:

fn x<'r>(a: &'r mut Vec<&'r A>) {
    y(a);
    y(a);
}

a 的生命周期是函数的完整持续时间,因为它用在每个语句中。借用检查器认为(基于对 y 中生命周期的约束) y需要 &A对于矢量引用的整个生命周期。所以你第二次调用y , 它认为引用仍在使用中。

删除显式生命周期修复它的原因是借用检查器将推断不同的生命周期:

fn y<'r, 's>(a: &'r mut Vec<&'s A>) {}

现在它们没有捆绑在一起,借阅检查员不再相信y需求&Aa 的整个生命周期内.

关于rust - 如果它的生命周期与其内容相同,为什么我不能两次使用对 Vec 的可变引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54460475/

相关文章:

struct - 我可以限制结构的生命周期污染吗?

rust - 我如何存储闭包并将它们与 Actix actors 一起使用?

rust - 改变本地状态的回调

c++ - 函数中局部变量的生命周期是否一定等于该函数执行的生命周期?

string - 从 `&' 中获取比当前函数更长生命周期的 str` `String`

rust - 如何在实现 Debug 时访问指定的精度?

rust - 指定 Rust 闭包生命周期

arrays - 暂时将 [u8] 转化为 [u16]

c - 将 libvips 静态链接到 Windows 中的 Rust 程序

rust - 一生可能活得不够长