3.4.1 Typestate 模式示例
01-Typestate 模式示例 — Comprehensive Rust
2 分钟阅读
译文 · 基于 Comprehensive Rust
Typestate 模式:示例
Typestate 模式将值运行时状态的一部分编码进其类型。这使我们能在编译期防止无效或不适用的操作。
| |
Serializer 使用流程图:
+------------+ serialize struct +-----------------+
| Serializer | ------------------> | SerializeStruct | <------+
+------------+ +-----------------+ |
|
| ^ | | |
| | finish struct | | serialize field |
| +-----------------------------+ +------------------+
|
+---> finish
本示例受 Serde 的
Serializertrait 启发。Serde 在内部使用 typestate 确保序列化遵循有效结构。更多信息见:https://serde.rs/impl-serializer.htmlTypestate 的核心思想是:状态转换通过消费一个值并产生一个新值来完成。在每一步,只有对该状态有效的操作才可用。
在本例中:
我们从
Serializer开始,它只允许我们开始序列化一个结构体。一旦调用
.serialize_struct(...),所有权移入SerializeStruct值。此后我们只能调用与序列化结构体字段相关的方法。原来的
Serializer不再可访问——防止我们混合模式(例如在结构体中途再开始另一个 struct)或过早调用finish()。只有在调用
.finish_struct()之后,我们才重新得到Serializer。此时可以终结输出或复用。若忘记调用
finish_struct()并提前 drop 掉SerializeStruct,Serializer也会被 drop。这确保不完整输出不会泄漏到系统中。相比之下,若像上一页那样把一切都直接实现在
Serializer上,就无法阻止有人跳过重要步骤或混合序列化流程。