Skip to content

Commit e60a32f

Browse files
authored
Merge pull request #1543 from EluvK/eluvk/translation/appendix/rust-versions
translation(appendix/rust-versions) : 1.87 && 1.88
2 parents 92d9894 + 2f4fba8 commit e60a32f

File tree

4 files changed

+198
-1
lines changed

4 files changed

+198
-1
lines changed

src/SUMMARY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,3 +393,5 @@
393393
- [1.84](appendix/rust-versions/1.84.md)
394394
- [1.85](appendix/rust-versions/1.85.md)
395395
- [1.86](appendix/rust-versions/1.86.md)
396+
- [1.87](appendix/rust-versions/1.87.md)
397+
- [1.88](appendix/rust-versions/1.88.md)

src/appendix/rust-versions/1.86.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Rust 新版解读 | 1.86 | Trait upcasting
22

3-
> Rust 1.86 官方 release doc: [Announcing Rust 1.86.0 | Rust Blog](https://blog.rust-lang.org/2025/04/03/Rust-1.86.0.html)
3+
> Rust 1.86 官方 release doc: [Announcing Rust 1.86.0 | Rust Blog](https://blog.rust-lang.org/2025/04/03/Rust-1.86.0/)
44
55
通过 [rustup](https://www.rust-lang.org/tools/install) 安装的同学可以使用以下命令升级到 1.86 版本:
66

src/appendix/rust-versions/1.87.md

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# Rust 新版解读 | 1.87 | 十周年🎉
2+
3+
[Rust 1.0](https://blog.rust-lang.org/2015/05/15/Rust-1.0/) 十周年🎉
4+
5+
> Rust 1.87 官方 release doc: [Announcing Rust 1.87.0 | Rust Blog](https://blog.rust-lang.org/2025/05/15/Rust-1.87.0/)
6+
7+
通过 [rustup](https://www.rust-lang.org/tools/install) 安装的同学可以使用以下命令升级到 1.87 版本:
8+
9+
```shell
10+
$ rustup update stable
11+
```
12+
13+
## 匿名管道
14+
15+
1.87 版本为标准库添加了匿名管道支持,包括与 `std::process::Command` 输入/输出方法的集成。例如,现在可以相对简单地合并标准输出和标准错误流,如下所示,而过去需要额外线程或平台特定函数才能实现。
16+
17+
```rust
18+
use std::process::Command;
19+
use std::io::Read;
20+
21+
let (mut recv, send) = std::io::pipe()?;
22+
23+
let mut command = Command::new("path/to/bin")
24+
// 标准输出和标准错误都会写入同一个管道,实现合并
25+
.stdout(send.try_clone()?)
26+
.stderr(send)
27+
.spawn()?;
28+
29+
let mut output = Vec::new();
30+
recv.read_to_end(&mut output)?;
31+
32+
// 必须在进程退出前读取管道内容,避免程序输出过多时填满系统缓冲区
33+
assert!(command.wait()?.success());
34+
```
35+
36+
## 安全的架构内置函数
37+
38+
大多数仅因需要启用目标特性而被标记为不安全的 `std::arch` 内置函数,现在可以在已启用相应特性的安全代码中调用。例如,以下使用手动内置函数实现数组求和的示例程序,现在核心循环可以使用安全代码。
39+
40+
```rust
41+
#![forbid(unsafe_op_in_unsafe_fn)]
42+
43+
use std::arch::x86_64::*;
44+
45+
fn sum(slice: &[u32]) -> u32 {
46+
#[cfg(target_arch = "x86_64")]
47+
{
48+
if is_x86_feature_detected!("avx2") {
49+
// 安全性:我们已检测到运行时启用了该特性,因此调用此函数是安全的
50+
return unsafe { sum_avx2(slice) };
51+
}
52+
}
53+
54+
slice.iter().sum()
55+
}
56+
57+
#[target_feature(enable = "avx2")]
58+
#[cfg(target_arch = "x86_64")]
59+
fn sum_avx2(slice: &[u32]) -> u32 {
60+
// 安全性:__m256i 和 u32 具有相同的有效性
61+
let (prefix, middle, tail) = unsafe { slice.align_to::<__m256i>() };
62+
63+
let mut sum = prefix.iter().sum::<u32>();
64+
sum += tail.iter().sum::<u32>();
65+
66+
// 在 1.87 中核心循环现在是完全安全的代码,因为内置函数要求与函数定义匹配的目标特性 (avx2)
67+
let mut base = _mm256_setzero_si256();
68+
for e in middle.iter() {
69+
base = _mm256_add_epi32(base, *e);
70+
}
71+
72+
// 安全性:__m256i 和 u32 具有相同的有效性
73+
let base: [u32; 8] = unsafe { std::mem::transmute(base) };
74+
sum += base.iter().sum::<u32>();
75+
76+
sum
77+
}
78+
```
79+
80+
## `asm!` 跳转到 Rust 代码
81+
82+
内联汇编 (`asm!`) 现在可以跳转到 Rust 代码中的 labeled 代码块。这为底层编程提供了更大灵活性,例如在操作系统内核中实现优化控制流,或更高效地与硬件交互。
83+
84+
- `asm!` 宏现在支持 label 标签语法,作为跳转目标
85+
- label 必须是返回类型为 `()``!` 的块表达式
86+
- 跳转时会执行该块,然后继续执行 `asm!` 块之后的代码
87+
- 在同一 `asm!` 里使用调用中使用 output 和 label 仍处于[unstable](https://github.com/rust-lang/rust/issues/119364)
88+
89+
```rust
90+
unsafe {
91+
asm!(
92+
"jmp {}",
93+
label {
94+
println!("从汇编跳转而来!");
95+
}
96+
);
97+
}
98+
```
99+
100+
更多细节请参阅[参考文档](https://doc.rust-lang.org/nightly/reference/inline-assembly.html#r-asm.operand-type.supported-operands.label)
101+
102+
## 特征定义中 `impl Trait` 的精确捕获 (`+ use<...>`)
103+
104+
本版本稳定了在特征定义中使用 `impl Trait` 返回类型时指定具体捕获的泛型类型和生命周期的功能。这扩展了 [1.82](https://blog.rust-lang.org/2024/10/17/Rust-1.82.0/#precise-capturing-use-syntax) 版本中对非特征函数的稳定支持。
105+
106+
一些示例解语法:
107+
108+
```rust
109+
trait Foo {
110+
fn method<'a>(&'a self) -> impl Sized;
111+
112+
// ... 解语法后类似:
113+
type Implicit1<'a>: Sized;
114+
fn method_desugared<'a>(&'a self) -> Self::Implicit1<'a>;
115+
116+
// ... 而使用精确捕获时 ...
117+
fn precise<'a>(&'a self) -> impl Sized + use<Self>;
118+
119+
// ... 解语法后类似:
120+
type Implicit2: Sized;
121+
fn precise_desugared<'a>(&'a self) -> Self::Implicit2;
122+
}
123+
```
124+
125+
## Others
126+
127+
其它更新细节,和稳定的 API 列表,参考[原Blog](https://blog.rust-lang.org/2025/05/15/Rust-1.87.0/#stabilized-apis)

src/appendix/rust-versions/1.88.md

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

0 commit comments

Comments
 (0)