3.4.3.1 Serializer:实现 Root

01-Serializer:实现 Root — Comprehensive Rust

译文 · 基于 Comprehensive Rust

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

Serializer:实现 Root

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 3.4.3.1 Serializer:实现 Root
// SPDX-License-Identifier: Apache-2.0
# use std::fmt::Write as _;
struct Serializer<S> {
    // [...]
    indent: usize,
    buffer: String,
    state: S,
}

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

impl Serializer<Root> {
    fn new() -> Self {
        // [...]
        Self { indent: 0, buffer: String::new(), state: Root }
    }

    fn serialize_struct(mut self, name: &str) -> Serializer<Struct<Root>> {
        // [...]
        writeln!(self.buffer, "{name} {{").unwrap();
        Serializer {
            indent: self.indent + 1,
            buffer: self.buffer,
            state: Struct(self.state),
        }
    }

    fn finish(self) -> String {
        // [...]
        self.buffer
    }
}

回到最初的有效转换示意图,可将实现的开端可视化如下:

                          serialize
                          struct
+--------------------+ --------------> +----------------------------+
| "Serializer<Root>" |                 | "Serializer<Struct<Root>>" |
+--------------------+ <-------------- +----------------------------+
                         finish struct
         |
         |
         |
finish   |
         V

     +--------+
     | String |
     +--------+
  • 在我们的 Serializer「根」处,唯一允许的构造是 Struct。

  • Serializer 只能在该根层终结为 String。

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