gpt4 book ai didi

rust - 将向量传递给函数的替代方案?

转载 作者:行者123 更新时间:2023-11-29 08:07:15 25 4
gpt4 key购买 nike

我目前正在通过编写一个克隆棋盘游戏“波多黎各”的项目来学习 Rust。

Game 结构:我选择 players 成员作为数组切片,因为它只能包含 3、4 或 5 个玩家(据我所知,这是结构内数组切片的完美用例,而不是向量)

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

问题是这种实例化 Game 结构的方法看起来有点麻烦,我觉得有办法绕过它(比如只传递 names 参数并以某种方式在 new 函数中创建数组切片)。

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

我试图将 vec!() 声明移动到 new 函数中,但是,当然,它不起作用,因为它在函数的末尾被删除了 block 。

use super::board::Board;
use super::player::Player;
use super::planatation::ResourceType;

#[derive(Debug)]
pub struct Game<'a> {

board: Board,
players: &'a [Player],
governor: &'a Player
}

impl<'a> Game<'a> {

pub fn new(names: &[String], players: &'a mut Vec<Player>) -> Self {
let num_of_players = names.len() as i32;
let board = Board::new(num_of_players);

if num_of_players < 3 || num_of_players > 5 {
panic!("Only 3, 4 or 5 players may play");
}

if num_of_players < 5 {
for (i, name) in names.iter().enumerate() {
if i < 2 {
players.push(Player::new(name.to_string(), ResourceType::Indigo));
} else {
players.push(Player::new(name.to_string(), ResourceType::Corn));
}
}
} else { // num_of_player == 5
for (i, name) in names.iter().enumerate() {
if i < 3 {
players.push(Player::new(name.to_string(), ResourceType::Indigo));
} else {
players.push(Player::new(name.to_string(), ResourceType::Corn));
}
}
}

Game {
board: board,
players: players,
governor: &players[0]
}
}
}

最佳答案

正如您已经注意到的,切片不拥有它的数据,它只引用它们。这就是为什么您必须在结构之外创建玩家并将它们传递给游戏结构的原因。如果你想让你的结构容纳玩家,他们必须是 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 )对于所有玩家,只需将索引存储到州长的向量中。作为一种变体,您可以强制要求调控器始终是 firstVec 的元素容纳所有玩家。
  • 做你已经做过的事。 (然而,这可能意味着你不能轻易地改变它们(因为你一次只能有一个可变引用)。你可以通过内部可变性来解决这个问题,但我不确定它是否值得)<
  • 只存储Vec<String>拿着球员的名字。从中,您可以得出玩家的数量。如果播放器的种类相当简单,您甚至可以不显式存储播放器,而是通过其索引导出播放器的种类(我认为这可能是可能的,因为您确定 IndigoCorn 的方式) ).缺点是你身边没有玩家,但也许你可以在没有他们的情况下为整个游戏建模。

关于rust - 将向量传递给函数的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54375052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com