Rust团队很高兴地宣布Rust的新版本,即1.61.0。Rust是一种编程语言,使每个人都能建立可靠和高效的软件。
如果你已经通过rustup安装了以前的Rust版本,你可以用1.61.0获得:
rustup update stable
如果你还没有,你可以从我们网站的相应页面获得rustup,并在GitHub上查看1.61.0的详细发布说明。
如果你想通过测试未来的版本来帮助我们,你可以考虑在本地更新,使用测试频道(rustup default beta)或夜间频道(rustup default nightly)。 请报告你可能遇到的任何bug!
1.61.0稳定版中的内容
自定义退出代码从main
一开始,Rustmain 函数只能返回单位类型() (隐式或显式),总是在退出状态中表示成功,如果你想要其他的,就必须调用process::exit(code) 。从Rust 1.26开始,main 被允许返回一个Result ,其中Ok 翻译成C语言的EXIT_SUCCESS ,Err 翻译成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指针。 -
特质界线:
T: Copy现在你可以在通用参数上写入特质边界,如const fn,而以前只允许Sized。 -
dyn Trait类型:类似地, 现在可以处理trait对象, 。const fndyn Trait -
impl Trait类型: 的参数和返回值现在可以是不透明的 类型。const fnimpl 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_mutPin::static_refVec::retain_mutVecDeque::retain_mutWrite为Cursor<[u8; N]>std::os::unix::net::SocketAddr::from_pathnamestd::process::ExitCodestd::process::Terminationstd::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,没有你们,我们不可能做到这一点,谢谢你们!"。