内容提要
Rust 1.100.0 发布:never 类型 ! 历经十年稳定,可用于任意位置并替代 Infallible;稳定 allocator_api 核心,支持 Vec 和 Box 自定义分配器;新增 DropGuard 在作用域退出时执行闭包;新增 conjure_zst 安全创建零大小类型;Cargo 新增未使用依赖警告、构建目录哈希统一及依赖冷却期功能,可延迟采用新版本以降低供应链风险。
延伸解读
never 类型稳定:十年磨一剑的兼容性代价
! 类型历经十年和五次稳定尝试才落地,本次不仅允许在任意位置书写 !,还将 Infallible 改为其别名。但代价是:在 2024 之前的版本中,never 类型回退从 () 改为 !,这属于破坏性变更。文章说明影响“大多不可察觉”,但可能让编译器把更多代码判定为不可达。若依赖因此报错,应优先更新依赖,因为修复可能已发布。
allocator_api 只稳定了核心,生态仍在路上
本次稳定的是 Allocator trait 及 Vec、Box 的自定义分配器支持,属于 Allocators 1.0 项目目标的基础。文章明确表示“还有很多工作要做”,包括把自定义分配器扩展到更多集合和指针类型。对库作者而言,现在可以基于稳定 trait 设计分配器,但不应假设所有标准容器都已支持;后续还会有更多稳定化落地。
依赖冷却期:降低供应链风险,但不是万能药
Cargo 新增 min-publish-age 依赖解析,可配置如 3 天的冷却期,跳过发布时间过新的版本并提示被暂缓的版本。文章指出恶意包常在发布后数小时或数天内被发现,因此该功能能降低部分供应链攻击风险。但需注意:无 pubtime 字段的版本不会被暂缓,cargo install 忽略该设置,且冷却期并非完整防御,仍需照常审查依赖更新。
构建目录哈希统一:内部改动也可能影响构建流程
Cargo 现在一致地将构建配置哈希应用到 build-dir 的所有内容,改为按构建步骤组织目录,并把哈希从文件名移到父目录。文章称这是内部改动,但可能破坏那些针对缺失或不完整特性做了变通处理的构建流程和测试,部分变通可能已不再需要。若遇到问题,可参考 cargo#17287 寻找解决方案,该改动也为缓存垃圾回收等后续改进铺路。
Q&A
Rust 1.100.0 中 never 类型 ! 稳定后有什么新用法?
never 类型 ! 现在可以在任意位置命名,例如用于函数返回类型 -> ! 或泛型参数 Result<T, !>;同时 Infallible 被改为 ! 的别名,使旧 API 兼容。
Rust 1.100.0 的 allocator_api 稳定了哪些内容?
稳定了 allocator_api 的核心部分,包括 Allocator trait,允许库作者定义自定义分配器,目前可与 Vec 和 Box 一起使用。
DropGuard 是什么,怎么用?
core::mem::DropGuard 是一个辅助类型,接收一个变量和一个闭包,在 drop 时运行闭包并消费变量;它实现 Deref 和 DerefMut 以便正常使用变量,还提供 dismiss 方法在不想运行析构时返回变量。
conjure_zst 函数有什么作用?为什么是 unsafe 的?
std::mem::conjure_zst 是专门用于安全创建零大小类型值的函数,替代 transmute 等写法;因为某些 API 依赖无法构造这类类型来保证安全,所以该函数是 unsafe 的。
Cargo 的依赖冷却期功能怎么开启?有什么限制?
在 .cargo/config.toml 中设置 [registry] global-min-publish-age = "3 days" 即可开启;Cargo 会跳过发布时间短于该值的版本。限制包括:依赖注册表记录发布时间,无 pubtime 字段的版本不会被阻止;cargo install 忽略该设置。
Rust 1.100.0 对 Cargo 的未使用依赖警告有什么限制?
该警告只在构建所有可能使用依赖的构建目标时出现,例如 cargo check --bin foo 不会显示未使用 [dependencies] 的警告,因为可能有其他 bin 使用;未使用的 dev-dependencies 也不会警告,因为无法确保构建所有开发目标。