我正在尝试制作一个迭代器,用于从移动列表中过滤出某些移动。为了不占用返回的移动所有权,它们被引用。然而,在这样做时,会出现“missing lifetime specifier”编译器错误。由于我有一系列的结构体,我认为解决问题的第一步是开始在MoveFilter上放置生命周期,然后在IntoIterator中将其类型项Item上的生命周期加上。然而,它抱怨使用了未声明的生命周期。
pub struct GameMove {
pub from: usize,
pub to: usize,
pub move_type: GameMoveType,
pub piece_type: PieceType,
}
#[derive(PartialEq, Clone, Debug)]
pub enum GameMoveType {
Quiet,
Capture(PieceType),
}
#[derive(PartialEq, Clone, Debug)]
pub enum PieceType {
King,
Pawn
}
pub fn match_move_type(move_type: &GameMoveType) -> usize {
match move_type {
GameMoveType::Quiet => 0,
GameMoveType::Capture(_) => 1,
}
}
pub struct MoveFilter<'a> {
legal_moves: Vec<GameMove>,
move_type: GameMoveType,
}
impl IntoIterator for MoveFilter {
type Item = &'a GameMove;
type IntoIter = MoveFilterIterator;
fn into_iter(self) -> Self::IntoIter {
MoveFilterIterator {
legal_moves: self.legal_moves,
move_type: match_move_type(&self.move_type),
index: 0,
}
}
}
pub struct MoveFilterIterator {
legal_moves: Vec<GameMove>,
move_type: usize,
index: usize,
}
impl Iterator for MoveFilterIterator {
type Item = &GameMove;
fn next(&mut self) -> Option<&GameMove> {
while self.index < self.legal_moves.len() {
if match_move_type(&self.legal_moves[self.index].move_type) == self.move_type {
Some(&self.legal_moves[self.index])
} else {
self.index += 1;
}
}
None
}
}
GameMoveType
的引用的另一种解决方案是仅为其派生“Copy”(这又将要求同样操作PieceType
)。类型似乎非常轻量级,因此除非您当然已从MCVE的定义中剥离了某些昂贵的复制组件,否则Copy
看起来是比较合适的。 - Michail