Rust 团队很高兴地宣布 Rust 的新版本 1.61.0。Rust 是一种编程语言,使每个人都能够构建可靠和高效的软件。
如果您通过 rustup 安装了以前版本的 Rust,您可以通过以下方式获得 1.61.0:
rustup update stable
如果您还没有,可以 从我们网站上的相应页面获取,并在 GitHub 上查看 1.61.0 的 详细rustup
发行说明。
如果您想通过测试未来的版本来帮助我们,您可以考虑在本地更新以使用 beta 频道 ( rustup default beta
) 或 nightly 频道 ( rustup default nightly
)。请报告您可能遇到的任何错误!
1.61.0 稳定版中有什么
自定义退出代码来自main
一开始,Rustmain
函数只能返回单元类型()
(隐式或显式),总是在退出状态下指示成功,如果你想否则你必须调用process::exit(code)
. 从 Rust 1.26main
开始,允许返回 a Result
,其中Ok
翻译为 CEXIT_SUCCESS
和 Err
to EXIT_FAILURE
(也调试打印错误)。在引擎盖下,这些替代的返回类型被一个不稳定的Termination
特征统一起来。
在这个版本中,这个Termination
特性终于稳定了,还有一个更通用的ExitCode
类型,它包装了特定于平台的返回类型。这具有SUCCESS
和FAILURE
常量,并且还实现From<u8>
了更多任意值。该Termination
特征也可以为您自己的类型实现,允许您在转换为ExitCode
.
例如,这是为git bisect run
脚本编写退出代码的一种类型安全的方法:
use std::process::{ExitCode, Termination};
#[repr(u8)]
pub enum GitBisectResult {
Good = 0,
Bad = 1,
Skip = 125,
Abort = 255,
}
impl Termination for GitBisectResult {
fn report(self) -> ExitCode {
// Maybe print a message here
ExitCode::from(self as u8)
}
}
fn main() -> GitBisectResult {
std::panic::catch_unwind(|| {
todo!("test the commit")
}).unwrap_or(GitBisectResult::Abort)
}
更多功能const fn
此版本中稳定了几个增量功能,以在函数中启用更多 const
功能:
fn
指针的基本处理:您现在可以在const fn
. 例如,这对于为解释器构建编译时函数表可能很有用。但是,仍然不允许调用fn
指针。- 特征边界:您现在可以将泛型参数的特征边界写入
const fn
,例如T: Copy
,以前只Sized
允许的地方。 dyn Trait
types:同样,const fn
现在可以处理 trait 对象,dyn Trait
.impl Trait
types:参数和返回值const fn
现在可以是不透明impl Trait
类型。
请注意,特征特性尚不支持从const fn
.
请参阅参考书的常量评估const
部分以了解有关上下文当前功能的更多信息,并且可以在rust#57563中跟踪未来的功能。
锁定 stdio 的静态句柄
三个标准 I/O 流 – Stdin
、Stdout
和Stderr
– 每个都有一个lock(&self)
允许对同步读取和写入的更多控制。但是,他们归还了一生借用的锁卫&self
,因此它们仅限于原始手柄的范围。这被确定为不必要的限制,因为底层锁实际上是在静态存储中,所以现在卫兵返回一个'static
生命周期,与句柄断开连接。
例如,一个常见的错误来自试图获取句柄并将其锁定在一个语句中:
// error[E0716]: temporary value dropped while borrowed
let out = std::io::stdout().lock();
// ^^^^^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
// |
// creates a temporary which is freed while still in use
现在锁守卫是'static
,不是从那个临时借来的,所以这行得通!
稳定的 API
现在稳定了以下方法和特征实现:
Pin::static_mut
Pin::static_ref
Vec::retain_mut
VecDeque::retain_mut
Write
为了Cursor<[u8; N]>
std::os::unix::net::SocketAddr::from_pathname
std::process::ExitCode
std::process::Termination
std::thread::JoinHandle::is_finished
以下以前稳定的功能现在是const
:
<*const T>::offset
和<*mut T>::offset
<*const T>::wrapping_offset
和<*mut T>::wrapping_offset
<*const T>::add
和<*mut T>::add
<*const T>::sub
和<*mut T>::sub
<*const T>::wrapping_add
和<*mut T>::wrapping_add
<*const T>::wrapping_sub
和<*mut T>::wrapping_sub
<[T]>::as_mut_ptr
<[T]>::as_ptr_range
<[T]>::as_mut_ptr_range
其他变化
Rust 1.61.0 版本中还有其他更改。查看 Rust、 Cargo和Clippy的变化。
在未来的版本中,我们计划将 Linux 内核的基线要求增加到 3.2 版,并将 glibc 的基线要求增加到 2.17 版。我们希望您在rust#95026中提供反馈。
1.61.0 的贡献者
许多人聚集在一起创建了 Rust 1.61.0。没有你们,我们不可能做到。 谢谢!