使用结构的默认特征作为枚举选项

Use Default trait for struct as enum option

我有一个这样的枚举:

enum States {
    A { opts: Vec<States> },
    B { opts: Vec<States> },
    C { opts: Vec<States> },
}

我想为它实现 Default 特性。不适用于枚举本身:

impl Default for States {
    fn default() -> States {
        States::A { vec![] }
    }
}

但对于 States::AStates::BStates::Copts 具有默认值。可能吗?

这目前是不可能的,因为枚举变体不是第一个 class 类型。有一个开放的 RFC 提出 "making enum variants first-class types": RFC 1450。在接受和实施之前,大多数人使用的解决方法是为每个变体制作适当的结构,然后制作一个简单的枚举来包装这些结构:

struct A { opts: Vec<States> }
struct B { opts: Vec<States> }
struct C { opts: Vec<States> }

enum States {
    A(A),
    B(B),
    C(C)
}

然后您可以为 ABC 实施 Default

impl Default for A {
    fn default() -> A {
        A { opts: Vec::new() }
    }
}

并将它们用作 A::default()B::default()C::default()