类似结构体的枚举类型能被用作类型吗?

5
考虑以下(非法)示例:
enum Foo {
    Bar { i: i32 },
    Baz,
}

struct MyStruct {
    field: Foo::Bar,
}

Foo::Bar 是一个类似结构体的变体。我发现它们非常有用。然而,我需要在另一个结构体中存储该结构体的实例,就像上面的 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个回答

9
在这种情况下,
enum Foo {
    Bar { i: i32 },
    Baz,
}

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

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接