如何编写可反序列化为含结构体枚举的结构体的TOML文件?
解决Rust中枚举结构体成员的多行TOML反序列化问题
针对你定义的AOrB枚举和Config结构体,要实现多行TOML的正确反序列化,核心是遵循serde对枚举的TOML序列化规则:枚举字段必须是一个仅包含单个子表的结构,子表的键对应枚举变体的名称。
正确的多行TOML写法
1. 使用A单元变体时
z = "你的字符串值" [a_or_b.A] # 单元变体无需额外字段,保留空表即可
2. 使用B结构体变体时
z = "长文本值可以直接写,或者用TOML多行语法" [a_or_b.B] b1 = "超长的b1内容,这里可以直接换行写,或者用TOML的多行字符串语法" b2 = """ 这是一个跨多行的字符串 无需用反斜杠续行 适合内容较长的场景 """
错误写法分析
你遇到的enum table must contain exactly one table错误,通常是因为错误地将B的字段直接放在a_or_b的表下,比如:
# 错误示例,会触发报错 z = "test" [a_or_b] b1 = "x" b2 = "y"
这种写法会让serde将a_or_b识别为普通结构体,而非枚举,因此不符合预期的枚举反序列化规则。
补充:TOML多行字符串技巧
如果字段值特别长,TOML支持两种多行字符串格式:
- 双引号
""":会保留换行符,支持转义字符 - 单引号
''':保留换行符,但不解析转义字符,适合包含双引号的内容
内容的提问来源于stack exchange,提问作者MetroWind
相关产品推荐
相关产品推荐

