【问题标题】:Can struct-like enums be used as types?类似结构的枚举可以用作类型吗?
【发布时间】:2015-04-29 06:26:20
【问题描述】:

考虑以下(非法)示例:

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,
}

【问题讨论】:

    标签: enums rust


    【解决方案1】:

    在第一种情况下,

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2019-01-05
        • 1970-01-01
        • 2013-01-13
        • 2020-12-22
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多