使用struct trait作为枚举选项的默认特征

时间:2016-04-21 16:45:26

标签: enums rust default

我有一个这样的枚举:

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::C,要设置opts的默认值。有可能吗?

1 个答案:

答案 0 :(得分:4)

目前这不可能,因为枚举变体不是头等类型。有一个开放的RFC提出“制作枚举变体的一流类型”: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)
}

然后,您可以为DefaultAB实施C

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

并将其用作A::default()B::default()C::default()