Rust 发布了 1.77.0 版本,快来更新一下吧:
$ rustup update stable
支持 C-string 字面量
在 C 语言中表示常见的字符串字面量时,会使用用双引号括起来的字符序列。
char *str = "Hello, World!";
在 C 语言中,字符串以空字节('\0')结尾,因此双引号内的字符序列会被自动以空字节结尾,形成一个以空字节结尾的 C 字符串。Rust 现在支持了 C 字符串字面量(c"abc"),这些字面量会在内存中扩展为以空字节结尾的字符串,类型为 &'static CStr。这使得编写与需要以空字节结尾的字符串进行交互的外部语言接口更加容易,所有相关的错误检查(例如,内部空字节的缺失)都会在编译期执行。
支持在 async fn 中进行递归调用
在之前的版本中,由于编译器的限制,异步函数无法调用自身。而 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! 宏,该宏提供了对结构体相关公共字段的字节偏移量的访问。当需要字段的偏移量但没有现有类型实例时,这个宏非常有用。在稳定版上已经可以实现这样的宏,但在没有类型实例的情况下,实现它将需要复杂的 unsafe 代码,容易意外引入未定义行为。
用户现在可以通过 offset_of!(StructName, field) 访问公共字段的偏移量。它会展开为一个 usize表达式,其中偏移量以字节表示并从结构体的起始位置开始计算。
默认启用 release 配置文件中的 strip
Cargo 配置文件中未在输出中启用调试信息(例如,debug = 0)时,配置文件将默认启用 strip = "debuginfo"。这主要是因为(预编译的)标准库随调试信息一起提供,意味着即使本地编译没有显式请求调试信息,静态链接的结果也会包含标准库的调试信息。希望启用调试信息的用户可以在相关 Cargo 配置文件中使用调试标志来显式启用它。
稳定了一些 API
下面这些 API 可以安心使用了:
array::each_ref
array::each_mut
core::net
f32::round_ties_even
f64::round_ties_even
mem::offset_of!
slice::first_chunk
slice::first_chunk_mut
slice::split_first_chunk
slice::split_first_chunk_mut
slice::last_chunk
slice::last_chunk_mut
slice::split_last_chunk
slice::split_last_chunk_mut
slice::chunk_by
slice::chunk_by_mut
Bound::map
File::create_new
Mutex::clear_poison
RwLock::clear_poison
当然,还有其它一些更新,这里不赘述了,参阅官方文档吧~