首页 > 解决方案 > 为什么我不能对引用的 Vec 使用可变引用两次,如果它的生命周期与其内容相同?

问题描述

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>)时,即从 s 内容的引用中删除生命周期Vec,它编译得很好。

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

标签: rustlifetime

解决方案


在这个函数中:

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是函数的完整持续时间,因为它在每个语句中都使用。借用检查器认为(基于对 中的生命周期的约束yy需要&A向量引用的整个生命周期。所以第二次调用时y,它认为引用仍在使用中。

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

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

y现在它们不再捆绑在一起,借用检查器不再&A相信a.


推荐阅读