Rust 删除Vec产品第二次可变借用发生在此处

Rust 删除Vec产品第二次可变借用发生在此处,rust,Rust,我在一个结构中有一个列表(sprites:Vec) 我必须添加和删除对象,添加没有问题,但无法删除 添加对象 pub fn_clean(){} fn创建精灵(&mut self,x:f32,y:f32){ 设src_rect=rect::new(0,0,9,9); 让mut sprite=sprite::new(0,x,y,src_rect); self.sprite.push(RefCell::new(sprite)); println!(“{}”,self.sprites.len()); }

我在一个结构中有一个列表(
sprites:Vec

我必须添加和删除对象,添加没有问题,但无法删除

添加对象

pub fn_clean(){}
fn创建精灵(&mut self,x:f32,y:f32){
设src_rect=rect::new(0,0,9,9);
让mut sprite=sprite::new(0,x,y,src_rect);
self.sprite.push(RefCell::new(sprite));
println!(“{}”,self.sprites.len());
}
删除对象

让mut pos:usize=0;
用于精灵在&mut self.sprite中{
sprite.borrow_mut().x+=1.0;
//碰撞雪碧射击
如果sprite.borrow_mut().x>(self.map.nbr_列作为u32*self.map.tile_wight)作为f32{
println!(“枪战{}”,pos);
自。精灵。移除(位置);
//自行移除雪碧(位置);
}
pos+=1;
}
如果我执行
pop
而不是
remove


我清理了代码以生成可执行的minumun代码

使用std::cell::RefCell;
酒吧结构精灵{
发布索引:usize,
酒吧x:f32,
酒吧y:f32,
发布vx:f32,
酒吧:f32,
}
impl精灵{
pub fn new(索引:usize,x:f32,y:f32)->Sprite{
让mut sprite:sprite=sprite{
索引:索引,,
x:x,
y:y,
vx:0.0,
vy:0.0,
};
(传说中的)精灵
}
}
酒吧结构游戏{
精灵:Vec,
地图:f32,
}
impl游戏{
pub fn new()->游戏{
游戏{
精灵:vec![],
地图:30.0,
}
}
发布fn更新(&mut self){
让mut pos:usize=0;
自我。精灵。保留(| s|){
//s-is&RefCell
s、 借用_mut().x+=1.0;

s、 sprite in&mut self.sprites
的行
创建跨越整个循环体的
self.sprites
集合的可变借用。这意味着您无法在循环体内部修改集合本身,因为这样做将导致循环无效

当您尝试调用
self.sprites.remove(pos)
时,此调用将导致
pos
之后的所有精灵在内存中向前移动一个。这是禁止的,因为您当前有一个要删除的精灵的引用,并且还因为
pos+1
处的精灵将被跳过(调用
remove
将其向前移动一步,但迭代器将移动到它后面的插槽)

Rust提供了一种执行循环体尝试执行的方法:方法

self.sprites.retain(|s |{//s is&RefCell)
s、 借用_mut().x+=1.0;

谢谢你的帮助,这段代码很有用

。。。
让map_width=(self.map.nbr_列作为u32*self.map.tile_wight)作为f32;
自我。精灵。保留(| s|){
//s-is&RefCell
s、 借用_mut().x+=1.0;

s、 borrow().x请尝试进行适当的修改。部分代码缺失(什么是
Sprite
,涉及哪些方法等),这使得我们无法重现问题。此外,给定的代码片段存在格式问题,并且包含不相关的定义(例如
\u clean
)。如果您可以构建在中显示完全相同问题的内容,则效果越好。提供了其他提示。欢迎使用堆栈溢出!您的问题可能会由的答案回答。如果不是,请您的问题解释差异。否则,我们可以将此问题标记为已回答。为什么非惯用<代码>:&RefCell
?仅为了明确
保留
闭包接收的内容,我对
s.borrow()有一些问题