零变体枚举的一个用法是表示无法到达的代码。例如,一个不会失败的TryFrom
或FromStr
。这通常在使用泛型时发生。以下是一个示例:OnceCell
同时具有get_or_init()
和get_or_try_init()
方法。
enum Void {}
match self.get_or_try_init(|| Ok::<T, Void>(f())) {
Ok(val) => val,
Err(void) => match void {},
}
get_or_init()
方法调用了get_or_try_init()
。然而,如果get_or_try_init()
调用没有内联,那么在运行时会因为不可能的Err
情况而产生开销和panic。一旦稳定下来,这将被never类型所取代。使用空枚举相比于单元结构体有两个优点:
match value {}
转换为never类型,而never类型可以被强制转换为任何其他类型。以上述once_cell
代码为例。
()
有一个单一的值。该类型的所有值都相同。零变体枚举根本没有值。 - Sven Marnach