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 详细发布说明。
想参与未来版本的测试?您可以本地切换到 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_unsafelint 级别改为“拒绝”。
- 宏片段说明符
macro_rules!宏中的expr片段说明符现也匹配const和_表达式。
- 缺少宏片段说明符
missing_fragment_specifierlint 现为硬性错误,拒绝未指定片段类型的宏元变量。
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 和稳定报告。
从诊断中隐藏 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。
元组的 FromIterator 和 Extend 支持
Rust 1.85.0 扩展了对元组的支持,新增从单一 (T,) 到 12 项 (T1, T2, ..., T12) 的 FromIterator 和 Extend 实现。
例如:
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::newptr::fn_addr_eqio::ErrorKind::QuotaExceededio::ErrorKind::CrossesDevices{float}::midpointUnsigned {integer}::midpointNonZeroU*::midpoint- 元组(1 到 12 元)的
std::iter::Extend和FromIterator<(A, ...)> std::task::Waker::noopmem::size_of_valmem::align_of_valLayout::for_value等
其他更新
评论区
登录后即可发表评论