Rust 团队很高兴地宣布 Rust 新版本 1.74.0 发布。Rust 是一种旨在帮助所有人构建可靠且高效软件的编程语言。
如果你之前通过 rustup 安装了 Rust,你可以使用以下命令获取 1.74.0 版本:
$ rustup update stable
如果你还没有安装 rustup,你可以从我们的网站上的相应页面获取 rustup
,并查看 GitHub 上 1.74.0 版本的详细发布说明。
如果你想通过测试未来的版本来帮助我们,你可以考虑在本地更新到 beta 频道 (rustup default beta
) 或 nightly 频道 (rustup default nightly
)。请报告你可能遇到的任何错误!
1.74.0 稳定版的新特性
通过 Cargo 进行 Lint 配置
正如 RFC 3389 中提议的那样,Cargo.toml
清单现在支持 [lints]
表,用于配置来自编译器和其他工具的 lints 的报告级别(forbid, deny, warn, allow)。因此,无需使用 -F
/-D
/-W
/-A
设置 RUSTFLAGS
(这会影响整个构建),或者使用 crate 级别的属性,例如
#![forbid(unsafe_code)]
#![deny(clippy::enum_glob_use)]
现在你可以将这些写入你的包清单中,以便 Cargo 处理
[lints.rust]
unsafe_code = "forbid"
[lints.clippy]
enum_glob_use = "deny"
这些也可以在 [workspace.lints]
表中配置,然后像许多其他工作区设置一样,通过 [lints] workspace = true
继承。Cargo 还将在决定哪些 crate 需要重建时跟踪这些设置的更改。
有关更多信息,请参阅 Cargo 参考手册的 lints
和 workspace.lints
部分。
Cargo 注册表身份验证
此版本中还包含了另外两个相关的 Cargo 功能:凭据提供程序和经过身份验证的私有注册表。
凭据提供程序允许配置 Cargo 如何获取注册表的凭据。内置提供程序包括用于 Linux、macOS 和 Windows 上特定于操作系统的安全密钥存储。此外,可以编写自定义提供程序以支持存储或生成令牌的任意方法。使用安全的凭据提供程序可以降低注册表令牌泄露的风险。
现在,注册表可以选择性地要求所有操作(而不仅仅是发布)进行身份验证。这使私有 Cargo 注册表能够提供更安全的 crate 托管。使用私有注册表需要配置凭据提供程序。
更多信息请参阅 Cargo 文档。
不透明返回类型中的投影
如果你曾经收到过 “返回类型不能包含引用父作用域生命周期的投影或 Self
” 这样的错误,现在你可以放心了!编译器现在允许在不透明返回类型(如 async fn
和 -> impl Trait
)中提及 Self
和关联类型。即使你对 “投影” 这样的术语一无所知,这种功能也使 Rust 更接近你期望的工作方式。
此功能之前有一个不稳定的特性门控,因为它的实现最初没有正确处理捕获的生命周期,一旦修复,就给予了时间来确保其健全性。有关更多技术细节,请参阅稳定化 pull request,其中描述了以下现在都允许的示例
struct Wrapper<'a, T>(&'a T);
// Opaque return types that mention `Self`:
impl Wrapper<'_, ()> {
async fn async_fn() -> Self { /* ... */ }
fn impl_trait() -> impl Iterator<Item = Self> { /* ... */ }
}
trait Trait<'a> {
type Assoc;
fn new() -> Self::Assoc;
}
impl Trait<'_> for () {
type Assoc = ();
fn new() {}
}
// Opaque return types that mention an associated type:
impl<'a, T: Trait<'a>> Wrapper<'a, T> {
async fn mk_assoc() -> T::Assoc { /* ... */ }
fn a_few_assocs() -> impl Iterator<Item = T::Assoc> { /* ... */ }
}
稳定的 API
core::num::Saturating
impl From<io::Stdout> for std::process::Stdio
impl From<io::Stderr> for std::process::Stdio
impl From<OwnedHandle> for std::process::Child{Stdin, Stdout, Stderr}
impl From<OwnedFd> for std::process::Child{Stdin, Stdout, Stderr}
std::ffi::OsString::from_encoded_bytes_unchecked
std::ffi::OsString::into_encoded_bytes
std::ffi::OsStr::from_encoded_bytes_unchecked
std::ffi::OsStr::as_encoded_bytes
std::io::Error::other
impl TryFrom<char> for u16
impl<T: Clone, const N: usize> From<&[T; N]> for Vec<T>
impl<T: Clone, const N: usize> From<&mut [T; N]> for Vec<T>
impl<T, const N: usize> From<[T; N]> for Arc<[T]>
impl<T, const N: usize> From<[T; N]> for Rc<[T]>
这些 API 现在在 const 上下文中是稳定的
兼容性说明
- 正如之前宣布的那样,Rust 1.74 提高了对 Apple 平台的要求。最低版本现在是
- macOS: 10.12 Sierra (首次发布于 2016 年)
- iOS: 10 (首次发布于 2016 年)
- tvOS: 10 (首次发布于 2016 年)
其他变更
查看 Rust, Cargo, 和 Clippy 中的所有更改。
1.74.0 版本的贡献者
许多人齐心协力创建了 Rust 1.74.0。没有你们大家,我们不可能做到。 谢谢!