如何将异构类型放入Rust结构

时间:2018-08-20 18:06:37

标签: 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或{{1}中的信息}。

1 个答案:

答案 0 :(得分:5)

Rust不会为您做任何类型到枚举变量的映射-您需要在枚举本身中明确包含数据:

var array1 = [];
var array2 = [];

for (let i = 1; i <= 10; i++) {
  array1.push(i);
  if (i % 2 === 0) {
    //console.log(array1);
    array2.push(array1);
    array1.length = 0;
  };
};
console.log(array1);
console.log(array2);

也就是说,如果在使用该枚举时需要使用这些结构类型的 only 上下文,则可以像这样组合它们:

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