Rust 新版解读 | 1.74 | 通过 Cargo 配置 Lint

Rust 1.74 官方 release doc: Announcing Rust 1.74.0 | Rust Blog

通过 rustup 安装的同学可以使用以下命令升级到 1.74 版本:

$ rustup update stable

通过 Cargo 配置 Lint

RFC 3389 提案,如今 Cargo.toml 支持通过 [lints] 表格来配置来自编译器或其它检查工具的 lints 的警告等级(forbid,deny,warn,allow)。等效于之前 crate 级别的属性:

#![allow(unused)]
#![forbid(unsafe_code)]
#![deny(clippy::enum_glob_use)]
fn main() {
}

如今可以通过配置 Cargo.toml 达到同样的效果:

[lints.rust]
unsafe_code = "forbid"

[lints.clippy]
enum_glob_use = "deny"

同时这些配置也可以在 [workspace.lints] 里配置,然后通过 [lints] workspace = true 的形式在 workspace 里的每个项目里继承这些配置。Cargo 会动态跟踪这里的配置变化,以在需要的时候重新编译检查。

更多信息,可以参考 Cargo 参考手册里的 lintsworkspace.lints 章节。

Cargo 注册服务认证

两个新的特性:自定义凭据提供商(credential providers)和 私有注册服务认证(authenticated private registries)

除了内置的和系统相关的安全凭据认证外,现在支持通过指定自定义的凭据提供商来生成和保存tokens,减少了注册服务token泄露的可能性。

注册服务如今对于所有操作都可以要求认证,(之前仅仅是发布操作),这对私有注册服务提供了更好的安全性。

更多相关信息可以参考 Cargo docs: registry-authentication

模糊返回类型推断

或许你也曾被编译器警告过:"return type cannot contain a projection or Self that references lifetimes from a parent scope"。如今这点得到了改善,编译器如今允许在返回类型里使用 Self 和关联类型 ( async fnimpl Trait

这个更新让 Rust 编译器变得更符合你期望它应该正常工作的样子,即使你都不知道这个 "projection" 的术语的含义是什么 :)

之前做不到这一点的原因是无法正常处理一些使用到的声明周期标注,更多技术细节可以看这个 stabilization pull request,其中提到了如今可以写出这样的代码:

#![allow(unused)]
fn main() {
struct Wrapper<'a, T>(&'a T);

// Opaque return types that mention `Self`:
impl Wrapper<'_, ()> {
    async fn async_fn() -> Self { /* ... */ }
    fn impl_trait() -> impl Iterator<Item = Self> { /* ... */ }
}

trait Trait<'a> {
    type Assoc;
    fn new() -> Self::Assoc;
}
impl Trait<'_> for () {
    type Assoc = ();
    fn new() {}
}

// Opaque return types that mention an associated type:
impl<'a, T: Trait<'a>> Wrapper<'a, T> {
    async fn mk_assoc() -> T::Assoc { /* ... */ }
    fn a_few_assocs() -> impl Iterator<Item = T::Assoc> { /* ... */ }
}
}

Others

其它更新细节,和稳定的API列表,参考原Blog