发布日期: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 详细发布说明。
想参与未来版本的测试?您可以本地切换到 beta
或 nightly
通道:
- Beta 通道:
rustup default beta
- Nightly 通道:
rustup default nightly
欢迎报告您发现的任何问题!
Rust 1.85.0 稳定版亮点:Rust 2024 正式发布
Rust 2024 版本概览
我们激动地宣布 Rust 2024 版本 现已稳定!Rust 的“版本”(Edition)机制允许开发者选择性采用可能影响向后兼容性的更改。 详情请参阅版本指南,了解实现方式及迁移步骤。
Rust 2024 是迄今为止我们发布的最大版本。 以下是主要更新总结,具体细节可参考版本指南:
语言特性更新
-
RPIT 生命周期捕获规则
- 当未使用
use<..>
时,impl Trait
类型的默认参数捕获规则发生变化。
- 当未使用
-
if let
临时变量作用域if let
表达式的临时变量作用域调整。
-
尾表达式临时变量作用域
- 块中尾部表达式的临时变量作用域调整。
-
Match 人体工程学预留
- 禁止某些模式组合,以避免混淆并为未来改进预留空间。
-
不安全的外部块
extern
块现需使用unsafe
关键字。
-
不安全属性
export_name
、link_section
和no_mangle
属性需标记为unsafe
。
-
unsafe_op_in_unsafe_fn
警告- 该 lint 现默认警告,需在不安全函数中使用显式的
unsafe {}
块。
- 该 lint 现默认警告,需在不安全函数中使用显式的
-
禁止引用
static mut
- 对
static mut
项的引用现默认生成错误。
- 对
-
Never 类型回退调整
!
类型强制转换规则调整,never_type_fallback_flowing_into_unsafe
lint 级别改为“拒绝”。
-
宏片段说明符
macro_rules!
宏中的expr
片段说明符现也匹配const
和_
表达式。
-
缺少宏片段说明符
missing_fragment_specifier
lint 现为硬性错误,拒绝未指定片段类型的宏元变量。
-
gen
关键字预留- 为未来添加生成器块预留
gen
关键字。
- 为未来添加生成器块预留
-
- 预留语法
为未来解析受保护字符串字面量预留#\"foo\"#
样式字符串和##
标记。
- 预留语法
标准库更新
-
预导入模块调整
Future
和IntoFuture
添加至预导入模块。
-
Box<[T]>
实现IntoIterator
- 调整
boxed
切片与迭代器的交互方式。
- 调整
-
新增不安全函数
std::env::set_var
、std::env::remove_var
和std::os::unix::process::CommandExt::before_exec
现为不安全函数。
Cargo 更新
-
Rust 版本感知解析器
- 默认依赖解析器行为调整,考虑
rust-version
字段。
- 默认依赖解析器行为调整,考虑
-
表和键名一致性
- 移除部分过时的
Cargo.toml
键。
- 移除部分过时的
-
拒绝未使用的继承默认特性
- 调整
default-features = false
与继承工作区依赖的交互。
- 调整
Rustdoc 更新
-
合并测试
- 文档测试现合并为单个可执行文件,显著提升性能。
-
嵌套 include! 调整
- 嵌套
include!
文件的相对路径行为变更。
- 嵌套
Rustfmt 更新
-
样式版本
- 引入“样式版本”概念,允许独立控制格式化版本与 Rust 版本。
-
格式化修复
- 大 量修复针对不同情况的格式化问题。
-
原始标识符排序
- 调整
r#foo
标识符的排序方式。
- 调整
-
版本排序
- 调整包含整数的标识符排序方式。
如何迁移至 Rust 2024
版本指南
提供了所有新功能的迁移说明及现有项目升级至新版本的通用步骤。
许多情况下,cargo fix
可自动完成必要更改,甚至您的代码可能无需任何变动即可适配 Rust 2024!
需要注意的是,cargo fix
的自动修复非常保守,避免更改代码语义。
您可能希望保留原有代码并使用 Rust 2024 的新语义,例如继续使用 expr
宏匹配器,
或忽略条件语句的转换以采用新的 2024 丢弃顺序语义。cargo fix
的结果仅为保守转换,不代表推荐做法。
感谢众多贡献者共同打造这一版本!
异步闭包(Async Closures)
Rust 现支持异步闭包,例如 async || {}
,调用时返回 future
。
这类似于 async fn
,可以捕获局部环境变量,类似于普通闭包与函数的区别。
标准库预导入中新增三个 相关 trait
:AsyncFn
、AsyncFnMut
和 AsyncFnOnce
。
过去,您可能通过普通闭包和异步块(如 || 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 和稳定报告。