Rust 团队很高兴地宣布 Rust 的新版本 1.84.0。Rust 是一种编程语言,它使每个人都能构建可靠且高效的软件。
如果您通过 rustup
安装了以前版本的 Rust,您可以使用以下命令获取 1.84.0:
$ rustup update stable
如果您还没有安装,可以从我们网站的相应页面获取 rustup
,并查看1.84.0 的详细发布说明。
如果您想通过测试未来的版本来帮助我们,您可以考虑在本地更新以使用 beta 频道 (rustup default beta
) 或 nightly 频道 (rustup default nightly
)。请报告您可能遇到的任何错误!
1.84.0 稳定版中的新特性
Cargo 考虑 Rust 版本进行依赖版本选择
1.84.0 稳定了最小支持 Rust 版本 (MSRV) 感知解析器,该解析器优先选择与项目声明的MSRV 兼容的依赖版本。通过 MSRV 感知版本选择,维护人员无需手动为每个依赖项选择旧版本,从而减少了支持旧工具链的工作量。
您可以通过.cargo/config.toml
选择启用 MSRV 感知解析器
[resolver]
incompatible-rust-versions = "fallback"
然后,当添加依赖项时
$ cargo add clap
Updating crates.io index
warning: ignoring [email protected] (which requires rustc 1.74) to maintain demo's rust-version of 1.60
Adding clap v4.0.32 to dependencies
Updating crates.io index
Locking 33 packages to latest Rust 1.60 compatible versions
Adding clap v4.0.32 (available: v4.5.23, requires Rust 1.74)
当在 CI 中验证最新依赖项时,您可以覆盖此设置
$ CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS=allow cargo update
Updating crates.io index
Locking 12 packages to latest compatible versions
Updating clap v4.0.32 -> v4.5.23
您还可以通过在 Cargo.toml 清单文件中设置package.resolver = "3"
来选择启用,但这将要求您将 MSRV 提升到 1.84。对于使用 2024 版本(将在 1.85 中稳定)的项目,新的解析器将默认启用。
这为库作者在决定采用新的 Rust 工具链功能时提供了更大的灵活性。以前,一个采用新 Rust 工具链功能的库会迫使使用旧 Rust 版本的下游用户升级他们的工具链或手动选择与他们的工具链兼容的旧版本的库(并避免运行 cargo update
)。现在,这些用户将能够自动使用与他们较旧的工具链兼容的较旧的库版本。
有关在决定 MSRV 策略时需要考虑的更多事项,请参阅文档。
开始迁移到新的 trait 求解器
Rust 编译器正在迁移到新的 trait 求解器实现。下一代 trait 求解器是对 Rust 类型系统核心组件的重新实现。它不仅负责检查 trait 边界(例如 Vec<T>: Clone
)是否成立,而且还被类型系统的许多其他部分使用,例如规范化(找出 <Vec<T> as IntoIterator>::Item
的底层类型)和等效类型(检查 T
和 U
是否相同)。
在 1.84 中,新的求解器用于检查 trait impl 的一致性。在高层次上,一致性负责确保对于给定类型,最多只有一个 trait 的实现,同时考虑来自其他 crate 的尚未编写或可见的代码。
此稳定化修复了旧实现的一些主要是理论上的正确性问题,导致可能会出现以前未报告的“trait 的实现冲突...”错误。根据通过Crater对可用代码的评估,我们预计受影响的模式将非常罕见。稳定化还提高了我们证明 impl 不重叠的能力,允许在某些情况下编写更多代码。
严格来源 API
在 Rust 中,指针不仅仅是“整数”或“地址”。例如,即使您“幸运地”在读取/写入之前释放的内存被重新分配,“使用后释放”也是未定义的行为。另一个例子是,通过从 &i32
引用派生的指针进行写入是未定义的行为,即使通过不同的指针写入相同的地址是合法的。这里的底层模式是指针的计算方式很重要,而不仅仅是此计算产生的地址。因此,我们说指针具有来源:为了完全描述 Rust 中与指针相关的未定义行为,我们不仅要了解指针指向的地址,还要跟踪它“派生自”哪个或哪些其他指针。
大多数情况下,程序员不需要过多担心来源,指针是如何派生的非常清楚。但是,当将指针强制转换为整数并返回时,生成的指针的来源未指定。在此版本中,Rust 添加了一组 API,这些 API 可以在许多情况下取代整数-指针-转换的使用,从而避免此类转换固有的歧义。特别是,现在可以在不将指针强制转换为整数或返回的情况下实现使用对齐指针的最低位来存储额外信息的模式。这使得代码更容易推理,更容易被编译器分析,并且也使 Miri 和 CHERI 等旨在检测和诊断指针误用的工具受益。
有关更多详细信息,请参阅标准库中关于来源的文档。
稳定的 API
Ipv6Addr::is_unique_local
Ipv6Addr::is_unicast_link_local
core::ptr::with_exposed_provenance
core::ptr::with_exposed_provenance_mut
<ptr>::addr
<ptr>::expose_provenance
<ptr>::with_addr
<ptr>::map_addr
<int>::isqrt
<int>::checked_isqrt
<uint>::isqrt
NonZero::isqrt
core::ptr::without_provenance
core::ptr::without_provenance_mut
core::ptr::dangling
core::ptr::dangling_mut
Pin::as_deref_mut
这些 API 现在在 const 上下文中是稳定的
AtomicBool::from_ptr
AtomicPtr::from_ptr
AtomicU8::from_ptr
AtomicU16::from_ptr
AtomicU32::from_ptr
AtomicU64::from_ptr
AtomicUsize::from_ptr
AtomicI8::from_ptr
AtomicI16::from_ptr
AtomicI32::from_ptr
AtomicI64::from_ptr
AtomicIsize::from_ptr
<ptr>::is_null
<ptr>::as_ref
<ptr>::as_mut
Pin::new
Pin::new_unchecked
Pin::get_ref
Pin::into_ref
Pin::get_mut
Pin::get_unchecked_mut
Pin::static_ref
Pin::static_mut
其他更改
查看 Rust、Cargo 和 Clippy 中发生的所有更改。
1.84.0 的贡献者
很多人共同创建了 Rust 1.84.0。没有大家,我们不可能做到这一点。感谢!