Skip to content

Commit

Permalink
Merge pull request #1402 from EluvK/eluvk/translation/appendix/rust-v…
Browse files Browse the repository at this point in the history
…ersions

translation(appendix/rust-versions) : 1.77
  • Loading branch information
sunface committed Mar 25, 2024
2 parents d5104f4 + c26f06e commit 7a602f0
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -383,3 +383,4 @@
- [1.74](appendix/rust-versions/1.74.md)
- [1.75](appendix/rust-versions/1.75.md)
- [1.76](appendix/rust-versions/1.76.md)
- [1.77](appendix/rust-versions/1.77.md)
55 changes: 55 additions & 0 deletions src/appendix/rust-versions/1.77.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Rust 新版解读 | 1.77 | 异步函数支持递归

> Rust 1.77 官方 release doc: [Announcing Rust 1.77.0 | Rust Blog](https://blog.rust-lang.org/2024/03/21/Rust-1.77.0.html)
通过 [rustup](https://www.rust-lang.org/tools/install) 安装的同学可以使用以下命令升级到 1.77 版本:

```shell
$ rustup update stable
```

## C 字符串字面量

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

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

## 支持递归调用 `async fn`

之前对于一个异步函数的递归调用,编译器会报错并推荐你使用 [crate: async_recursion](https://crates.io/crates/async_recursion)

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

```bash
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
```

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

```rust
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!`](https://doc.rust-lang.org/stable/std/mem/macro.offset_of.html) 宏,用于获取结构体字段的字节偏移量,这个宏在需要获取字段的偏移量但没有实例的情况下非常有用。在稳定之前,实现这样的宏需要使用复杂的不安全代码,很容易引入未定义行为。

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

## Cargo profiles 默认启用 strip

Cargo profiles 不在输出中启用 [debuginfo](https://doc.rust-lang.org/stable/cargo/reference/profiles.html#debug)(例如,debug = 0)的情况下,将默认启用 strip = "debuginfo"。

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

想要 debuginfo 的用户可以在相关的 [Cargo profile](https://doc.rust-lang.org/stable/cargo/reference/profiles.html#debug) 中显式启用它。

## Others

其它更新细节,和稳定的API列表,参考[原Blog](https://blog.rust-lang.org/2024/03/21/Rust-1.77.0.html#stabilized-apis)

0 comments on commit 7a602f0

Please sign in to comment.