是否可以派生用于解析相应Debug格式的任意类型的解析器?

时间:2018-11-27 00:15:14

标签: parsing rust

在Haskell中,作为一种语言功能,可以将解析器从字符串derive转换为任意数据类型:称为Read class。在Rust中可以这样做吗?也就是说,给定任意enum,例如:

#[derive(Debug)]
enum Foo {
    A { x: u32, s: String },
    B { v: Vec<u8> },
}

,并且考虑到Rust将Debug特征作为序列化任意数据类型的语言功能,是否还可以自动生成其相应的Parse特征?

换句话说,是否存在默认的Rust功能,该功能允许我派生parse(&str) -> Foo函数,以便对sparse(&s) == None的任何字符串format!("{:?}", parse(&s).unwrap()) == s进行操作?

1 个答案:

答案 0 :(得分:6)

不,没有这样的功能。 Debug供人类/程序员使用,不适用于机器。

不能保证Debug的输出甚至是可解析的格式,也不保证它包含类型的完整数据。

我建议改为使用Serde,并与您选择的现有定义的序列化格式配对。

如果愿意,可以通过调用Serde定义实现deriveDebug own FromStr属性。