将向量传递给函数的替代方法?

时间:2019-01-26 02:02:28

标签: rust slice lifetime

我目前正在通过编写一个项目来学习铁锈,该项目是棋盘游戏“ Puerto Rico”的一个副本。

Game结构: 我选择players成员作为数组切片,因为它只能包含3、4或5个播放器(据我了解,这是结构内部的数组切片而不是{{1 }})

Vec函数: 返回一个新的Game::new实例。它获取玩家名称列表和一个空的Game,并用适当的Vec实例填充它,然后将其作为数组切片存储在Player中。

问题在于,这种实例化Game结构的方法似乎很麻烦,我觉得有一种解决方法(如仅传递Game参数并以某种方式创建数组切片)在names函数中)。

那么,有办法吗?我是否应该将new成员更改为players

我试图将Vec声明移到vec!()函数中,但是,由于将其放在块末尾,所以当然不起作用。

new

1 个答案:

答案 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}})。缺点是您周围没有玩家,但也许您可以在没有玩家的情况下为整个游戏建模。