自 Rust 1.63 版本(下周发布)起,“非词法生命周期”(NLL)功能将默认启用。NLL 是 Rust 借用检查器的第二个迭代版本。RFC 文档非常详细地介绍了一些引入 NLL 的示例。“但是,”我听到你可能会问,“NLL 不是已经包含在 Rust 2018 中了吗?”没错,确实如此!但那时,NLL 只对 Rust 2018 代码启用,而 Rust 2015 代码则运行在“迁移模式”下。在“迁移模式”下,编译器会同时运行旧的和新的借用检查器并比较结果。这样一来,我们可以对那些本就不应该编译通过的旧代码发出警告;同时也能限制新代码中任何潜在 bug 的影响。随着时间的推移,我们逐步限制了迁移模式,使其越来越接近仅运行新式借用检查器:在下一个版本中,这一过程将完成,所有 Rust 代码都将使用 NLL 进行检查。
移除旧的借用检查器对用户有什么影响?
目前,我们已经几乎完全合并了“迁移模式”和“常规模式”,因此切换到 NLL 对用户体验的影响非常小。一些诊断信息有所改变,多数都是变得更好 -- Jack Huey 在他的博客文章中详细介绍了这些变化。
鸣谢
移除旧借用检查器的工作已经进行了多年。这是一个漫长、乏味且大多默默无闻的过程。我们想借此机会感谢为此付出努力的各位贡献者,并确保他们的辛勤工作得到认可。
- Jack Huey (赞助页面),负责推动稳定化的最终细节(诊断信息、协调行为差异)。
- Élie Roudninski,负责重构诊断代码,并(与 Jack 一起)细致地检查每个退化案例,逐一进行。
- Aaron Hill,为提升 NLL 诊断信息的质量做了大量改进。
- Matthew Jasper,负责协调与高阶生命周期相关的错误以及其他核心诊断信息的改进。
- Rémy Rakic,负责 rebase Matthew 的 PR 以及进行其他独立的诊断工作。
- Christopher Vittal,负责移除“比较”模式(别问为什么)。
- Centril,在早期协调迁移模式和常规模式方面做了大量工作。
- 当然还有最初交付该功能的 NLL 工作组成员(包括我本人、Felix Klock、Santiago Pastorino (赞助页面)、Matthew Jasper、David Wood、Rémy Rakic、Paul Daniel Faria、Nick Nethercote)。
如果你想了解更多细节,Jack 的博客文章包含一份有关所有相关工作的详细记述!读起来很有趣。
展望未来:“未来的借用检查器”会有什么变化?
Rust 借用检查器的下一个前沿是将 polonius 项目从研究实验阶段推进到生产代码阶段。Polonius 是借用检查器的下一代版本,它在 2018 年我们准备将 NLL 用于生产时,从主要的 NLL 工作中“分拆”出来。它最重要的贡献是修复了借用检查器的一个已知限制,如下面的示例所示:
这个例子目前无法编译(你可以自己试试),尽管并没有充分的理由不让它编译。你通常可以通过修改代码引入一个冗余的 let
来规避这个问题(如这个例子所示),但使用 polonius,它将直接编译通过。如果你想了解更多关于 polonius(以及现有借用检查器)如何工作1的信息,你可以观看我在 Rust Belt Rust 上的演讲。