3.4.3 带泛型的 Typestate 模式

带泛型的 Typestate 模式 — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.html

带泛型的 Typestate 模式

将 typestate 建模与泛型结合,我们可以表达更广范围的有效状态与转换,而无需重复逻辑。当状态数量增长,或多个状态共享行为但结构不同时,这种方法尤其有用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 3.4.3 带泛型的 Typestate 模式
// SPDX-License-Identifier: Apache-2.0
struct Serializer<S> {
    // [...]
    indent: usize,
    buffer: String,
    state: S,
}

struct Root;
struct Struct<S>(S);
struct Property<S>(S);
struct List<S>(S);

我们现在具备了为实现 Serializer 及其状态类型定义编写方法所需的全部工具。这确保我们的 API 只允许有效转换,如下图所示:

  • 通过用泛型跟踪父上下文,我们可以构造任意嵌套的序列化器,强制结构体、列表与属性状态之间的有效转换。

  • 这使我们能构建递归结构,同时严格控制每个状态下可访问的方法。

  • 对所有状态通用的方法可对任意 S 定义为 Serializer<S> 上的方法。

  • 标记类型(如 List<S>)不引入内存或运行时开销,因为除可能的零大小类型外它们不含数据。它们的唯一作用是通过类型系统强制正确的 API 用法。


3.4.3.1 Serializer:实现 Root

01-Serializer:实现 Root — Comprehensive Rust

3.4.3.2 Serializer:实现 Struct

02-Serializer:实现 Struct — Comprehensive Rust

3.4.3.3 Serializer:实现 Property

03-Serializer:实现 Property — Comprehensive Rust

3.4.3.4 Serializer:完整实现

04-Serializer:完整实现 — Comprehensive Rust

最后修改 August 11, 2026: 更新 (70a5af133)