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
需求&A
在 a
的整个生命周期内.