类似结构的枚举可以用作类型吗?

时间:2015-04-29 06:26:20

标签: enums rust

考虑以下(非法)示例:

enum Foo {
    Bar { i: i32 },
    Baz,
}

struct MyStruct {
    field: Foo::Bar,
}

Foo::Barstruct-like variant。我发现它们非常有用。但是,我有一个实例,我需要在另一个结构中存储结构的实例,如上面的MyStruct示例。将MyStruct::field更改为Foo将无效,因为该字段为Foo::Baz没有意义。它只是一个Foo::Bar的实例。

rustc告诉我上面的代码无效:

error: found value name used as a type: DefVariant(DefId { krate: 0u32, node: 4u32 }, DefId { krate: 0u32, node: 5u32 }, true)

我只是做错了什么,或者这不可能?如果不可能,有没有计划呢?

我知道我可以像这样解决这个问题,但我认为这是一个较差的选择,如果可能的话,这是我想避免的选择:

struct Bar {
    i: i32,
}

enum Foo {
    Bar(Bar),
    Baz,
}

struct MyStruct {
    field: Bar,
}

2 个答案:

答案 0 :(得分:6)

在第一种情况下,

enum Foo {
    Bar { i: i32 },
    Baz,
}

正如编译器告诉你Bar不是类型而是值,并且不能用作类型(error: found value name used as a type)。

第二种构造是通常使用的构造,例如在带有std::net::IpAddrstd::net::SocketAddr的标准库中。

答案 1 :(得分:6)

不,枚举变体本身不是一种类型,不能用作类型。