我正在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还是很陌生,所以我不一定总是知道要寻找什么。
答案 0 :(得分:2)
Rust编译器需要知道Vec中的每个元素将决定如何布局内存(每个元素必须占用相同的空间量)。您的Space
结构具有类型参数T
,因此除非您也提供了type参数,否则尚不清楚Space
将占用多少空间。例如。 Vec<Space<i32>>
可以工作。
如果您想要Vec
大小不同的对象,一种常见的方法是使用trait objects的向量。在您的示例中,您可能有一个Vec<Box<Event>>
,这是实现Event
特征的对象的向量,这里vec的每个元素都是一个Box(智能指针),指向实现{{ 1}}。
Event