Rust 1.80.0类型推断兼容性破坏了时间库等现有代码


Rust 1.80.0 破坏了时间库等现有代码,暴露了类型推断的兼容性问题 :

该问题是由 Box 中添加的FromIterator的新 impl(实现)引起的,这对推断类型的 Rust 代码产生了连锁影响。

当编译器通过检查分配给变量的值来推断变量的类型时,就会发生类型推断,这样就可以编写更简洁的代码,因为不需要明确声明类型。

在 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 应有的稳定性和可靠性水平”。