考虑以下(非法)示例:
enum Foo {
Bar { i: i32 },
Baz,
}
struct MyStruct {
field: Foo::Bar,
}
Foo::Bar
是struct-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,
}
答案 0 :(得分:6)
在第一种情况下,
enum Foo {
Bar { i: i32 },
Baz,
}
正如编译器告诉你Bar
不是类型而是值,并且不能用作类型(error: found value name used as a type
)。
第二种构造是通常使用的构造,例如在带有std::net::IpAddr
和std::net::SocketAddr
的标准库中。
答案 1 :(得分:6)
不,枚举变体本身不是一种类型,不能用作类型。