Rust 团队很高兴地宣布 Rust 的新版本 1.74.0。Rust 是一种编程语言,它使每个人都能构建可靠而高效的软件。
如果您之前通过 rustup 安装了 Rust 版本,您可以使用以下命令获取 1.74.0:
$ rustup update stable
如果您还没有安装,您可以从我们网站的相应页面获取 rustup
,并查看 GitHub 上1.74.0 的详细发行说明。
如果您想通过测试未来的版本来帮助我们,您可以考虑将本地更新为使用 beta 通道(rustup default beta
)或 nightly 通道(rustup default nightly
)。请报告您可能遇到的任何错误!
1.74.0 稳定版中的新功能
通过 Cargo 进行 Lint 配置
正如 RFC 3389 中提出的那样,Cargo.toml
清单现在支持一个 [lints]
表来配置编译器和其他工具的 lint 报告级别(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 更接近您可能期望的工作方式,即使您不了解“投影”之类的术语。
此功能有一个不稳定的特性门,因为它的实现最初没有正确处理捕获的生命周期,并且一旦修复,就会留出时间来确保其可靠性。有关更多技术细节,请参阅稳定化拉取请求,其中描述了以下现在都允许的示例:
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。没有你们大家,我们不可能做到这一点。谢谢!