Rust 新版解读 | 1.77 | 异步函数支持递归

Rust 1.77 官方 release doc: Announcing Rust 1.77.0 | Rust Blog

通过 rustup 安装的同学可以使用以下命令升级到 1.77 版本:

$ rustup update stable

C 字符串字面量

Rust 现在支持 C 字符串字面量(c"abc"),这些字面量会在内存中扩展为类型为 &'static CStr 的字符串,且有 \0 (nul-byte) 作为终止符。

这使得编写与需要用到这类具有终止符的字符串的外部语言接口进行交互的代码更容易,所有相关的错误检查(例如,缺少 nul-byte )都在编译时执行。

支持递归调用 async fn

之前对于一个异步函数的递归调用,编译器会报错并推荐你使用 crate: async_recursion

现在,这个限制已经被解除,且编译器会提示你使用一些间接的方式来避免函数状态的无限制增加。

error[E0733]: recursion in an async fn requires boxing
note: a recursive `async fn` call must introduce indirection such as `Box::pin` to avoid an infinitely sized future

由此可以正常使用下述代码了:

#![allow(unused)]
fn main() {
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 版本稳定了 offset_of! 宏,用于获取结构体字段的字节偏移量,这个宏在需要获取字段的偏移量但没有实例的情况下非常有用。在稳定之前,实现这样的宏需要使用复杂的不安全代码,很容易引入未定义行为。

用户现在可以使用 offset_of!(StructName, field) 来获取公共字段的偏移量。这会展开为一个 usize 表达式,表示从结构体开始的字节偏移量。

Cargo profiles 默认启用 strip

Cargo profiles 不在输出中启用 debuginfo(例如,debug = 0)的情况下,将默认启用 strip = "debuginfo"。

这主要是因为(预编译的)标准库附带了 debuginfo,这意味着即使本地编译没有显式请求 debuginfo,静态链接的结果也会包含标准库的 debuginfo。

想要 debuginfo 的用户可以在相关的 Cargo profile 中显式启用它。

Others

其它更新细节,和稳定的API列表,参考原Blog