rust - 如何将异构类型放入 Rust 结构中

标签 rust

<分区>

我的问题分两部分(第一部分没搞定,所以转到第二部分,还是有问题)

第 1 部分:如何将异构 struct 类型插入到 HashMap 中?起初我想通过 enum

来实现

例如,

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);

但是我得到了一个“Expected type: TypeA, found type TypeB”错误

第 2 部分:然后我去了文档并阅读了 Using Trait Objects that Allow for Values of Different Types ,并将问题简化为仅尝试将异构类型放入 Vec 中。所以我完全遵循了教程,但我仍然遇到相同类型的错误(在文档的情况下,错误现​​在是“Expected type SelectBox, found type Button”.

我知道静态类型是 Rust 的重要组成部分,但是谁能告诉我/告诉我/推荐我任何与将不同的 struct 类型放入 Vec 中相关的信息> 或 HashMap

最佳答案

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 - 如何将异构类型放入 Rust 结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51936299/

相关文章:

loops - 从向量中删除相邻的值

arrays - 如何创建包含大型数组的结构体数组?

rust - 编译完成后可以执行任务吗?

rust - 我怎样才能说服借用检查器允许我缓存值?

rust - 如何使用 init/exit 语义包装本地库

multidimensional-array - 是否有一个 Rust ndarray 等价于切片上的 numpy 算术?

iterator - 如何迭代结构集合作为特征对象引用的迭代器?

rust - 我什么时候应该在 Rust 中使用特征作为类型?

java - 是否可以一起使用 Java、SWIG 和 Rust?

rust - 装箱列表的第一个 Cons 是否在堆栈上?