我目前正在通过编写一个项目来学习铁锈,该项目是棋盘游戏“ Puerto Rico”的一个副本。
Game
结构:
我选择players
成员作为数组切片,因为它只能包含3、4或5个播放器(据我了解,这是结构内部的数组切片而不是{{1 }})
Vec
函数:
返回一个新的Game::new
实例。它获取玩家名称列表和一个空的Game
,并用适当的Vec
实例填充它,然后将其作为数组切片存储在Player
中。
问题在于,这种实例化Game
结构的方法似乎很麻烦,我觉得有一种解决方法(如仅传递Game
参数并以某种方式创建数组切片)在names
函数中)。
那么,有办法吗?我是否应该将new
成员更改为players
?
我试图将Vec
声明移到vec!()
函数中,但是,由于将其放在块末尾,所以当然不起作用。
new
答案 0 :(得分:2)
您已经注意到,切片并不拥有其数据,它仅引用它们。这就是为什么必须在结构外部创建玩家并将其传递给游戏结构的原因。如果您希望自己的结构能够容纳玩家,那么他们必须是Vec
而不是一片。
如果governor
不是该结构的成员,我建议您简单地使用Vec
(或ArrayVec
)并使用它。但是,这意味着governor
不能(通常)是对该相同矢量的引用(请参见Why can't I store a value and a reference to that value in the same struct?)。
根据governor
和其他“常规”播放器的确切语义和用例,我将执行以下操作之一:
Vec
(或ArrayVec
)用于“常规”玩家,另外还有一个州长用于州长。如果您经常需要对“常规”玩家和州长执行相同的操作,那么这可能会很麻烦,但是您可以引入一种方法,该方法可在所有玩家和州长上返回迭代器。Vec
(或ArrayVec
),只需将索引存储到州长的向量中即可。作为一种变体,您可以强制要求州长始终是first
的{{1}}元素,其中包含所有玩家。Vec
,其中包含玩家名称。由此,您可以得出玩家数量。如果播放器的类型相当简单,您可能甚至不用显式地存储播放器,而是通过其索引来导出播放器的类型(我想这可能是因为您确定Vec<String>
或{ {1}})。缺点是您周围没有玩家,但也许您可以在没有玩家的情况下为整个游戏建模。