|
|
|
@ -0,0 +1,68 @@
|
|
|
|
|
# Rust 新版解读 | 1.88 | let_chains
|
|
|
|
|
|
|
|
|
|
> Rust 1.88 官方 release doc: [Announcing Rust 1.88.0 | Rust Blog](https://blog.rust-lang.org/2025/06/26/Rust-1.88.0/)
|
|
|
|
|
|
|
|
|
|
通过 [rustup](https://www.rust-lang.org/tools/install) 安装的同学可以使用以下命令升级到 1.88 版本:
|
|
|
|
|
|
|
|
|
|
```shell
|
|
|
|
|
$ rustup update stable
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## let 链式表达式
|
|
|
|
|
|
|
|
|
|
该特性允许在 `if` 和 `while` 条件中使用 `&&` 连接的 `let` 语句,甚至可以与布尔表达式混合使用,从而减少 `if`/`if let` 和 `while`/`while let` 之间的差异。`let` 子表达式中的模式可以是不可反驳或可反驳的,绑定变量可以在链式后续部分和代码体中使用。
|
|
|
|
|
|
|
|
|
|
例如,以下代码片段组合了多个条件,之前需要嵌套 `if let` 和 `if` 块才能实现:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
if let Channel::Stable(v) = release_info()
|
|
|
|
|
&& let Semver { major, minor, .. } = v
|
|
|
|
|
&& major == 1
|
|
|
|
|
&& minor == 88
|
|
|
|
|
{
|
|
|
|
|
println!("`let_chains` 在此版本中已稳定");
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
由于一些边界场景难以兼容,let 链式表达式仅在 Rust 2024 版本中可用,因为该特性依赖于 [`if let` 临时作用域](https://doc.rust-lang.org/edition-guide/rust-2024/temporary-if-let-scope.html) 变更以实现更一致的析构顺序。
|
|
|
|
|
|
|
|
|
|
## 裸函数
|
|
|
|
|
|
|
|
|
|
Rust 现在支持编写没有编译器生成的收尾代码和序言的裸函数,允许完全控制特定函数的生成汇编代码。这是在 `global_asm!` 块中定义函数的更符合人体工程学的替代方案。裸函数使用 `#[unsafe(naked)]` 属性标记,其函数体由单个 `naked_asm!` 调用组成。
|
|
|
|
|
|
|
|
|
|
例如:
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
#[unsafe(naked)]
|
|
|
|
|
pub unsafe extern "sysv64" fn wrapping_add(a: u64, b: u64) -> u64 {
|
|
|
|
|
// 等同于 `a.wrapping_add(b)`。
|
|
|
|
|
core::arch::naked_asm!(
|
|
|
|
|
"lea rax, [rdi + rsi]",
|
|
|
|
|
"ret"
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
手写的汇编块定义了整个函数体:与非裸函数不同,编译器不会对参数或返回值添加任何特殊处理。裸函数用于 Rust 的 [compiler-builtins](https://github.com/rust-lang/compiler-builtins)、操作系统和嵌入式应用程序等场景。
|
|
|
|
|
|
|
|
|
|
## 布尔配置
|
|
|
|
|
|
|
|
|
|
`cfg` 谓词现在支持布尔字面量 `true` 和 `false`,分别作为始终启用或禁用的配置。这适用于 Rust 的[条件编译](https://doc.rust-lang.org/reference/conditional-compilation.html)中的 `cfg` 和 `cfg_attr` 属性以及内置的 `cfg!` 宏,也适用于 Cargo `[target]` 表中的[配置](https://doc.rust-lang.org/cargo/reference/config.html#target)和[清单](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#platform-specific-dependencies)。
|
|
|
|
|
|
|
|
|
|
此前,空谓词列表可以用于无条件配置,例如 `cfg(all())` 用于启用,`cfg(any())` 用于禁用,但这种含义相当隐式且容易搞反。`cfg(true)` 和 `cfg(false)` 提供了一种更直接的方式来表达你的意图。
|
|
|
|
|
|
|
|
|
|
具体背景细节可以参考 [RFC-3695](https://rust-lang.github.io/rfcs/3695-cfg-boolean-literals.html)
|
|
|
|
|
|
|
|
|
|
## Cargo 自动缓存清理
|
|
|
|
|
|
|
|
|
|
从 1.88.0 开始,Cargo 将自动对其主目录中的缓存运行垃圾回收!
|
|
|
|
|
|
|
|
|
|
构建时,Cargo 会下载并缓存所需的依赖项。历史上,这些下载的文件永远不会被清理,导致 Cargo 主目录中的磁盘使用量无限增长。在此版本中,Cargo 引入了垃圾回收机制来自动清理旧文件(例如 `.crate` 文件)。Cargo 将删除从网络下载且 3 个月内未访问的文件,以及从本地系统获取且 1 个月内未访问的文件。请注意,如果在离线状态下运行(使用 `--offline` 或 `--frozen`),则不会进行此自动垃圾回收。
|
|
|
|
|
|
|
|
|
|
Cargo 1.78 以后会跟踪所需的访问信息以进行此垃圾回收。这是在实际清理开始之前引入的,以减少仍使用早期版本的用户的缓存更换。如果你经常使用比 1.78 版本更早的 Cargo 版本,并且希望某些仅由旧版本访问的 crate 不被重新下载,你可以在 Cargo 配置中设置 `cache.auto-clean-frequency = "never"`,如[文档](https://doc.rust-lang.org/nightly/cargo/reference/config.html#cache)所述。
|
|
|
|
|
|
|
|
|
|
有关更多信息,请参阅此功能的原始[不稳定公告](https://blog.rust-lang.org/2023/12/11/cargo-cache-cleaning/)。该设计的某些部分仍不稳定,例如 [cargo#13060](https://github.com/rust-lang/cargo/issues/13060) 中跟踪的 `gc` 子命令,因此仍有更多值得期待的内容!
|
|
|
|
|
|
|
|
|
|
## Others
|
|
|
|
|
|
|
|
|
|
其它更新细节,和稳定的 API 列表,参考[原Blog](https://blog.rust-lang.org/2025/06/26/Rust-1.88.0/#stabilized-apis)
|