rust - 为什么我不能对引用的 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
,它编译得很好。
为什么无法编译原始代码?我在这里看不到问题。对我来说,引用向量及其内容的生命周期意味着该向量及其内容存在相同的“时间”。我哪里错了?
解决方案
在这个函数中:
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
.
推荐阅读
- reactjs - 尝试从 React Web 应用程序获取数据并进入 Electron 应用程序以显示徽章计数
- jquery - Jquery 在 elecron.js 中无法正常工作
- php - Laravel - 完成后仍在内存中的作业处理方法
- java - Snackbar.setAnchorView(不工作);
- javascript - 分配失败 - JavaScript 堆内存不足
- c# - 使用“.NETFramework,Version=v4.6.1”恢复包“MyPackage 1.0.1”,自定义 nuget 包上的警告
- c - 当该函数位于另一个文件夹中的另一个 c 程序中时,如何使用 gdb ddebugger 进入该函数?
- javascript - 在 REST 中使用异步函数的原因是什么?
- ios - XCTest 测试用例失败,出现错误“无法安装或启动测试运行程序”。(根本错误:无法连接到设备)
- matlab - 如果输入错误的输入,如何将用户重定向回开始