跳到主要内容

Rust 1.85.0 和 Rust 2024 版本发布公告 - 最新特性与更新详解

鱼雪

发布日期:2025 年 2 月 20 日
作者:Rust 发布团队

Rust 团队欣喜地宣布推出 Rust 编程语言的新版本 Rust 1.85.0,并正式稳定 Rust 2024 版本。 Rust 是一款赋予开发者构建可靠、高效软件能力的编程语言。 本文将详细介绍如何升级至 Rust 1.85.0、Rust 2024 的主要更新内容以及迁移指南。


如何升级到 Rust 1.85.0

如果您已通过 rustup 安装了 Rust,只需运行以下命令即可升级到 1.85.0:

rustup update stable

如果您尚未安装 rustup,请访问 Rust 官方网站的相关页面获取安装程序, 并查看 Rust 1.85.0 详细发布说明

想参与未来版本的测试?您可以本地切换到 betanightly 通道:

  • Beta 通道:rustup default beta
  • Nightly 通道:rustup default nightly

欢迎报告您发现的任何问题!


Rust 1.85.0 稳定版亮点:Rust 2024 正式发布

Rust 2024 版本概览

我们激动地宣布 Rust 2024 版本 现已稳定!Rust 的“版本”(Edition)机制允许开发者选择性采用可能影响向后兼容性的更改。 详情请参阅版本指南,了解实现方式及迁移步骤。

Rust 2024 是迄今为止我们发布的最大版本。 以下是主要更新总结,具体细节可参考版本指南

语言特性更新

  1. RPIT 生命周期捕获规则

    • 当未使用 use<..> 时,impl Trait 类型的默认参数捕获规则发生变化。
  2. if let 临时变量作用域

    • if let 表达式的临时变量作用域调整。
  3. 尾表达式临时变量作用域

    • 块中尾部表达式的临时变量作用域调整。
  4. Match 人体工程学预留

    • 禁止某些模式组合,以避免混淆并为未来改进预留空间。
  5. 不安全的外部块

    • extern 块现需使用 unsafe 关键字。
  6. 不安全属性

    • export_namelink_sectionno_mangle 属性需标记为 unsafe
  7. unsafe_op_in_unsafe_fn 警告

    • 该 lint 现默认警告,需在不安全函数中使用显式的 unsafe {} 块。
  8. 禁止引用 static mut

    • static mut 项的引用现默认生成错误。
  9. Never 类型回退调整

    • ! 类型强制转换规则调整,never_type_fallback_flowing_into_unsafe lint 级别改为“拒绝”。
  10. 宏片段说明符

    • macro_rules! 宏中的 expr 片段说明符现也匹配 const_ 表达式。
  11. 缺少宏片段说明符

    • missing_fragment_specifier lint 现为硬性错误,拒绝未指定片段类型的宏元变量。
  12. gen 关键字预留

    • 为未来添加生成器块预留 gen 关键字。
    • 预留语法
      为未来解析受保护字符串字面量预留 #\"foo\"# 样式字符串和 ## 标记。

标准库更新

  1. 预导入模块调整

    • FutureIntoFuture 添加至预导入模块。
  2. Box<[T]> 实现 IntoIterator

    • 调整 boxed 切片与迭代器的交互方式。
  3. 新增不安全函数

    • std::env::set_varstd::env::remove_varstd::os::unix::process::CommandExt::before_exec 现为不安全函数。

Cargo 更新

  1. Rust 版本感知解析器

    • 默认依赖解析器行为调整,考虑 rust-version 字段。
  2. 表和键名一致性

    • 移除部分过时的 Cargo.toml 键。
  3. 拒绝未使用的继承默认特性

    • 调整 default-features = false 与继承工作区依赖的交互。

Rustdoc 更新

  1. 合并测试

    • 文档测试现合并为单个可执行文件,显著提升性能。
  2. 嵌套 include! 调整

    • 嵌套 include! 文件的相对路径行为变更。

Rustfmt 更新

  1. 样式版本

    • 引入“样式版本”概念,允许独立控制格式化版本与 Rust 版本。
  2. 格式化修复

    • 大量修复针对不同情况的格式化问题。
  3. 原始标识符排序

    • 调整 r#foo 标识符的排序方式。
  4. 版本排序

    • 调整包含整数的标识符排序方式。

如何迁移至 Rust 2024

版本指南 提供了所有新功能的迁移说明及现有项目升级至新版本的通用步骤。 许多情况下,cargo fix 可自动完成必要更改,甚至您的代码可能无需任何变动即可适配 Rust 2024!

需要注意的是,cargo fix 的自动修复非常保守,避免更改代码语义。 您可能希望保留原有代码并使用 Rust 2024 的新语义,例如继续使用 expr 宏匹配器, 或忽略条件语句的转换以采用新的 2024 丢弃顺序语义。cargo fix 的结果仅为保守转换,不代表推荐做法。

感谢众多贡献者共同打造这一版本!


异步闭包(Async Closures)

Rust 现支持异步闭包,例如 async || {},调用时返回 future。 这类似于 async fn,可以捕获局部环境变量,类似于普通闭包与函数的区别。 标准库预导入中新增三个相关 traitAsyncFnAsyncFnMutAsyncFnOnce

过去,您可能通过普通闭包和异步块(如 || async {})实现类似效果, 但内部块返回的 future 无法借用闭包捕获的值。 而异步闭包解决了这一问题:

let mut vec: Vec<String> = vec![];

let closure = async || {
vec.push(ready(String::from("")).await);
};

此外,异步闭包还支持使用 AsyncFn trait 表达高阶函数签名,返回 Future

use core::future::Future;

async fn f<Fut>(_: impl for<'a> Fn(&'a u8) -> Fut)
where
Fut: Future<Output = ()>,
{ todo!() }

async fn f2(_: impl for<'a> AsyncFn(&'a u8))
{ todo!() }

async fn main() {
async fn g(_: &u8) { todo!() }
f(g).await; // 类型不匹配错误
f2(g).await; // 正常运行!
}

异步闭包为这些问题提供了优雅的解决方案! 详情请参阅 RFC 3668稳定报告


从诊断中隐藏 trait 实现

新增 #[diagnostic::do_not_recommend] 属性,提示编译器不在诊断信息中显示指定的 trait 实现。 这对库作者很有用,可避免编译器提出无用或误导性的建议。 例如:

pub trait Foo {}
pub trait Bar {}

#[diagnostic::do_not_recommend]
impl<T: Foo> Bar for T {}

struct MyType;

fn main() {
let _object: &dyn Bar = &MyType;
}

添加此属性后,错误信息将更清晰,不再提及无关的 Foo 建议。 详情请参阅 RFC 2397


元组的 FromIteratorExtend 支持

Rust 1.85.0 扩展了对元组的支持,新增从单一 (T,) 到 12 项 (T1, T2, ..., T12)FromIteratorExtend 实现。

例如:

use std::collections::{LinkedList, VecDeque};

fn main() {
let (squares, cubes, tesseracts): (Vec<_>, VecDeque<_>, LinkedList<_>) =
(0i32..10).map(|i| (i * i, i.pow(3), i.pow(4))).collect();
println!("{squares:?}");
println!("{cubes:?}");
println!("{tesseracts:?}");
}

输出:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
[0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561]

std::env::home_dir() 更新

std::env::home_dir() 已弃用多年,因其在某些 Windows 配置下可能返回意外结果。 现调整其行为作为 bug 修复,后续版本将移除弃用警告。


稳定化的 API

以下 API 已稳定并支持 const 上下文:

  • BuildHasherDefault::new
  • ptr::fn_addr_eq
  • io::ErrorKind::QuotaExceeded
  • io::ErrorKind::CrossesDevices
  • {float}::midpoint
  • Unsigned {integer}::midpoint
  • NonZeroU*::midpoint
  • 元组(1 到 12 元)的 std::iter::ExtendFromIterator<(A, ...)>
  • std::task::Waker::noop
  • mem::size_of_val
  • mem::align_of_val
  • Layout::for_value

其他更新

查看 RustCargoClippy 的完整变更日志。