如何在Rust中收集通用类型的结构?

时间:2018-09-02 03:34:11

标签: list generics collections rust

我正在Rust中创建一个基于文本的垄断游戏作为个人项目。我当前的设置是将各种空间作为自己的结构(例如Property

use space::Event;

pub struct Property {
    message: String,
}

impl Property {
    pub fn new() -> Property {
        let message = String::from("Hello World!");
        Property { message: message }
    }
}

impl Event for Property {
    fn event(&self) {
        print!("{}", &self.message);
    }
}

和一个通用的Space结构,该结构包含一种空间类型(例如Space<Property>Space<Chance>)的实例。

pub trait Event {
    fn event(&self);
}

pub struct Space<T> {
    item: T,
}

impl<T: Event> Space<T> {
    pub fn new(item: T) -> Space<T> {
        Space { item: item }
    }

    pub fn event(&self) {
        &self.item.event();
    }
}

每种类型的空间都实现一个特征,要求它具有一个“事件”方法,泛型Space结构可以调用该方法。然后,我有一个Game结构,其中将包含某种形式的空间集合(除其他外)。

pub struct Game {
    spaces: Vec<Space>, // Does not work
}

很不幸,我在创建此收藏集时遇到了问题。无论我尝试哪一个告诉我,我都必须为Space指定类型参数。我如何收集通用类型的结构?如果我可以通过其索引拉起一个特定的空间,那将是更可取的,因为当我开始实现某些Chance卡,这些卡以后将您移至特定的空间时,这样做会更容易。抱歉,如果我缺少明显的内容,我对Rust还是很陌生,所以我不一定总是知道要寻找什么。

1 个答案:

答案 0 :(得分:2)

Rust编译器需要知道Vec中的每个元素将决定如何布局内存(每个元素必须占用相同的空间量)。您的Space结构具有类型参数T,因此除非您也提供了type参数,否则尚不清楚Space将占用多少空间。例如。 Vec<Space<i32>>可以工作。

如果您想要Vec大小不同的对象,一种常见的方法是使用trait objects的向量。在您的示例中,您可能有一个Vec<Box<Event>>,这是实现Event特征的对象的向量,这里vec的每个元素都是一个Box(智能指针),指向实现{{ 1}}。

Event