如何将不同类型的数据放入 Rust 结构体中

3
我是一名可以翻译文本的助手。
我的问题有两个部分(因为我无法得到第一个部分,所以我转向了第二个部分,但仍然有疑问)。
第一部分:如何将异构结构类型插入HashMap中?起初,我想通过枚举来实现它。
例如:
enum SomeEnum {
    TypeA,
    TypeB,
    TypeC,
}

struct TypeA{}
struct TypeB{}
struct TypeC{}

let hm = HashMap::new();
hm.insert("foo".to_string(), SomeEnum::TypeA);
hm.insert("bar".to_string(), SomeEnum::TypeB);
hm.insert("zoo".to_string(), SomeEnum::TypeC);

但我收到了一个"期望类型:TypeA,找到类型TypeB"的错误。

第二部分:然后我去看文档,阅读了有关使用允许不同类型值的Trait对象的内容,并将问题简化为尝试将异构类型放入Vec中。所以我完全按照教程进行操作,但仍然收到相同类型的错误(在文档的情况下,错误现在是"期望类型SelectBox,找到类型Button")。

我知道静态类型是Rust的重要组成部分,但有人能告诉我/展示给我/引用与将不同的struct类型放入VecHashMap相关的信息吗?

1个回答

5

Rust不会自动将类型映射到枚举变体中-您需要在枚举本身中明确包含数据:

use std::collections::HashMap;

enum SomeEnum {
    A(TypeA),
    B(TypeB),
    C(TypeC),
}

struct TypeA {}
struct TypeB {}
struct TypeC {}

fn main() {
    let mut hm = HashMap::new();
    hm.insert("foo".to_string(), SomeEnum::A(TypeA {}));
    hm.insert("bar".to_string(), SomeEnum::B(TypeB {}));
    hm.insert("zoo".to_string(), SomeEnum::C(TypeC {}));
}

尽管如此,如果你只需要在使用该枚举时使用这些结构类型,你可以将它们合并如下:

use std::collections::HashMap;

enum SomeEnum {
    A {},
    B {},
    C {},
}

fn main() {
    let mut hm = HashMap::new();
    hm.insert("foo".to_string(), SomeEnum::A {});
    hm.insert("bar".to_string(), SomeEnum::B {});
    hm.insert("zoo".to_string(), SomeEnum::C {});
}

Rust不会为您对结构体名称进行任何映射以匹配枚举变量 - 您需要在枚举本身中明确包含数据。没有问题吗? - Stargateur
@Stargateur:能不能详细说一下?对我来说,这个问题听起来像是他们试图将三种不同的类型插入哈希映射中,这将要求他们使用trait对象或将他们的三个类型包装在一个单独的枚举中(后者是我在答案中展示的)。也许,“Rust不会为您执行类型到枚举变量的任何映射”是我说话的更好方式。 - Joe Clay
好的,https://play.rust-lang.org/?gist=e8974a51ee3d664bebc734345e0484cc&version=stable&mode=debug&edition=2015 可以正常工作... someenum 是常见类型。 - Stargateur
@Stargateur:尽管编译器发出了警告,但没有任何结构被使用。枚举变量SomeEnum::TypeA和结构体TypeA之间没有实际关系,它们只是具有相同的名称。 - Joe Clay
哦,抱歉,我完全错了。 - Stargateur
@Stargateur:没问题,只是想确认我没有漏掉什么 :) - Joe Clay

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