将枚举定义为结构(为什么使用此语法)



在Rust的chrono库中,有一个src/format/mod.rs#L338-L345:代码

pub struct ParseError(ParseErrorKind);
enum ParseErrorKind {
OutOfRange,
...
}
  1. 在第一行中,语法struct ParseError(ParseErrorKind)是什么意思?枚举CCD_ 2有点";混叠的";作为一个名为ParseError的结构,还是ParseError是一个包含枚举类型为ParseErrorKind的匿名字段的结构?如果是后者,如何访问字段?或者这是别的东西
  2. 使用这种struct语法的优点是什么?为什么不直接使用ParseErrorKind作为类型(而不是将其包装到结构中(

在第一行中,语法结构ParseError(ParseErrorKind(是什么意思?枚举ParseErrorKind多少有点";混叠的";作为一个名为ParseError的结构,或者ParseError是一个包含枚举类型ParseErrorKind的匿名字段的结构?如果是后者,如何访问字段?或者这是别的东西?

它是一个元组结构,在本例中它封装了一个内部错误类型。与其他结构的主要区别在于字段没有命名。相反,它们像元组一样被访问(例如my_instace.0,指内部数据(。有关更多信息,请参阅文档

使用这种结构语法的优点是什么?为什么不直接使用ParseErrorKind作为类型(而不是将其包装到结构中(?

在这种情况下,它在单个类型上抽象枚举构造函数。我的猜测是,他们决定错误类型是一个实现细节,不应该在API中公开。请注意,ParseErrorKind是私有的,而ParseError是公共的(具有对内部单个元组的私有访问权限(。

此外,包装类型也是一种常见的模式,以便在这些类型不是您自己机箱的原生类型的情况下扩展这些类型的功能。

最新更新