Rust 团队日前发布了 Rust 的新版本 —— 1.77.0 正式版,Rust 是一种强大的编程语言,使开发者能够构建可靠、高效的软件。
关于 1.77.0 有关新特性可查看:blog.rust-lang.org/2024/03/21/…
如果已经安装了以前版本的 Rust,可以通过以下命令升级到 1.77.0 版本: $
rustup update stable
如果还没有安装,可以从网站上的相应页面获取 rustup , 并查看1.77.0 的详细发行说明 。也可以在 GitHub 上查看1.77.0 的发行日志 。
如果想使用测试未来版本,可以考虑在本地进行更新以使用 beta 版本(
rustup default beta
) 或 nightly 版本 (rustup default nightly
),这两个版本不太稳定,使用过程中可能遇到错误,如果遇到任何错误,可以发送报告
1.77.0 稳定版中有什么
这个版本是小版本更新,主要带来一些渐进性的改进并来带来整体性提升,使得 Rust 语言更加强大和易用,本文主要介绍其中几个功能和改进:
支持 C-string 字面量
Rust 现在支持C-string(C 字符串字面量)(例如 c"abc"
),它们在内存中扩展为以nul-byte
(空字节)结尾的字符串,类型为&'static CStr
。这使得编写与需要以nul-byte
(空字节)结尾的字符串进行交互的外部语言接口的代码变得更加容易,同时在编译时执行所有相关的错误检查(例如,确保内部没有空字节)。
let c_string: &CStr = c"Hello, world!";
支持异步函数递归
异步函数之前由于编译器的限制无法调用自身。在 1.77 版本中,该限制已经解除,异步函数可以递归调用自己,只要使用某种形式的间接方式来避免函数状态的无限大小。
这意味着像下面这样的代码现在可以正常工作:
async fn fib(n: u32) -> u32 {
match n {
0 | 1 => 1,
_ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await
}
}
稳定化的 offset_of! 宏
1.77.0 版本稳定了 offset_of!
宏,该宏提供了访问结构体字段字节偏移量的方法。当需要字段的偏移量而没有现有类型的实例时,此宏非常有用。在稳定版本上实现这样的宏已经是可能的,但是在没有类型实例的情况下,实现将需要复杂的不安全代码,这容易意外引入未定义行为。
现在用户可以使用 offset_of!(StructName, field)
访问公共字段的偏移量。这将扩展为一个 usize
表达式,其中包含从结构体开头开始的字节偏移量。
let offset: usize = offset_of!(StructName, field);
在非调试配置中默认启用 strip
没有启用调试信息(例如,debug = 0
)的 Cargo 配置现在默认会启用 strip = "debuginfo"
。
主要原因是(预编译的)标准库附带调试信息,这意味着即使本地编译没有明确请求调试信息,静态链接的结果也会包含来自标准库的调试信息。
想要调试信息的用户可以在相关的 Cargo 配置文件中使用 debug 标志显式启用它。
注:doc.rust-lang.org/stable/carg…
稳定的 API 列表
array::each_ref
和array::each_mut
core::net
f32::round_ties_even
和f64::round_ties_even
- 一系列切片操作函数,如
slice::first_chunk
,slice::last_chunk
,slice::chunk_by
等。 Bound::map
File::create_new
Mutex::clear_poison
和RwLock::clear_poison
其他变化
了解更多有关Rust、Cargo 和 Clippy 中所有变化的详细信息,请参阅完整的发布说明 ,更新的详细列表可查看
致敬贡献者
许多人齐心协力创建了 Rust 1.77.0。谢谢所有人
官方资料
关于1.77.0 升级的更多信息,可以查阅:
- 1.77.0 官方博客:blog.rust-lang.org/2024/03/21/…
- 1.77.0 版本标记:github.com/rust-lang/r…
- 1.77.0 变更日志:releases.rs/docs/1.77.0
- 1.77.0 感谢列表:thanks.rust-lang.org/rust/1.77.0
- 1.77.0 Cargo 更新:doc.rust-lang.org/nightly/rel…
- 1.77.0 Clippy 更新:github.com/rust-lang/r…