包含一段数据和被引用数据的结构中的生命周期



我正在写一个小的反人类卡片克隆供个人使用,并将其作为学习Rust的机会。我目前有以下结构:

// game.rs
pub struct Game<'c> {
deck: Deck,
players: Vec<Player<'c>>,
current_czar_index: usize,
}
// player.rs
pub struct Player<'c> {
pub hand: Vec<&'c Card>,
pub max_hand_size: usize,
pub is_czar: bool,
pub score: u8,
pub name: String,
}
// deck.rs
struct DiscardPile {
pub white: Mutex<Vec<usize>>,
pub black: Mutex<Vec<usize>>,
}
pub struct Deck {
white: Vec<Card>,
black: Vec<Card>,
pub used_sets: Vec<String>,
discard_pile: DiscardPile,
}
// card.rs
pub struct Card {
pub text: String,
pub uuid: Uuid,
pub pick: Option<u8>,
}

还有其他一些(即用于读取JSON文件的set(,但它们并不相关。

我在game.rs中有一个功能

pub fn deal_hands(&self) -> Result<(), Box<dyn std::error::Error>> {
for player in &mut self.players {
while player.hand.len() < player.max_hand_size {
player.add_card(self.deck.draw_white().unwrap())?;
}
}
Ok(())
}

这给了我以下错误:

error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src/game.rs:42:31
|
42 |                 player.add_card(self.deck.draw_white().unwrap())?;
|                                           ^^^^^^^^^^
|

它特别指出,它期待&mut Player<'_>,但发现了&mut Player<'c>的寿命。

如果你想亲眼看到代码,请点击此处。

我该如何修复这样一个终生错误,还是需要重新思考我的体系结构?

架构对我来说似乎很好。你可能只是错过了在某个地方传递lifetime参数。

我不完全确定,但我相信问题可能是.draw_white()正在返回Option<&Card>,并且不清楚所包含的Card的生存期应该是什么。我相信无论何时返回借来的值,都必须为借来的值附加一个生存期。否则,借款检查器无法判断借款价值的有效期。

也许可以尝试以下.draw_white()的定义,而不是

pub fn draw_white<'a>(&self) -> Option<&'a Card> {

然后,您需要将deal_hands()调整为如下所示。(正在努力找出正确的语法,但我认为它是这样的。(

pub fn deal_hands(&self) -> Result<(), Box<dyn std::error::Error>> {
for player<'c> in &mut self.players {
while player.hand.len() < player.max_hand_size {
player.add_card(self.deck.draw_white<'c>().unwrap())?;
}
}
Ok(())
}

最新更新