Rust 1.80.0 破坏了时间库等现有代码,暴露了类型推断的兼容性问题 :
该问题是由 Box
当编译器通过检查分配给变量的值来推断变量的类型时,就会发生类型推断,这样就可以编写更简洁的代码,因为不需要明确声明类型。
在 Rust 中,这依赖于只有一个匹配的实现,因此当添加额外的 impl 时,编译器有时无法再推断类型。如果安装了 Rust 编译器, rustc –explain E0282 将输出该问题的详细解释。
代码破坏的一个例子是用于日期和时间处理的时间库。这个问题早在 5 月份就被发现:“Error with rust-nightly: type annotations needed for Box<_>”。
然而,许多项目依赖于旧版本的 time crate,并且在几周前 Rust 1.80.0 发布时遭遇了构建失败。
受影响的项目
其中一个受影响的项目是 NixOS,这是一个流行的软件包管理和系统配置工具。
一位开发者说:在 NixOS 中,不稳定的构建(包括本地构建和 CI 构建)现在都会因此而失败,而要修复这个问题,就需要对每个受影响的软件包发布新版本。
开发者 kornel 在 Rust internals 列表中抱怨说,Rust 1.8.0 中的类型推断破坏没有得到很好的处理。 "尽管 Rust 并不把类型推论的变化算作语义断裂,但这是一个拙劣的借口,发布了一个影响广泛的变化,却没有试图缓和打击......甚至在 1.80 发布说明中也只字未提与最常用的 Rust crates 之一不兼容的问题。
他补充说,在 5000 多个库包中发现了这个回归regression现象。
另一位 Rust 参与者询问 API 团队如何 "在看到 5400 次回归后说'嗯,这很好'",并表示支持 "对推理回归进行流程变更以更加谨慎 "的建议,还补充说 "这可能只是一次'单纯的'推理回归,但影响已经大到人们将其称为'rust 2′'"。
一些开发者呼吁对 Rust 编译器进行更新,以还原这一变更。 这是一个棘手的问题,因为限制 Rust 团队在主要版本之间添加新的实现是一个重大限制,但这一事件表明这很容易破坏现有代码。
总之:
Rust 1.80.0 最新发布的版本破坏了非常流行的时间库以及其他现有代码,导致开发人员宣称该版本“低于 Rust 应有的稳定性和可靠性水平”。