我有一段代码需要对列表进行操作。此列表包含来自其他来源且需要处理并最终删除的项目。该列表还传递给多个函数,这些函数决定是添加还是删除项目。我创建了一个反映我的问题的示例代码:
use std::{cell::RefCell, rc::Rc};
pub fn foo() {
let list: Rc<RefCell<Vec<Rc<RefCell<String>>>>> = Rc::new(RefCell::new(Vec::new()));
list.borrow_mut()
.push(Rc::new(RefCell::new(String::from("ABC"))));
while list.borrow().len() > 0 {
let list_ref = list.borrow();
let first_item = list_ref[0].borrow_mut();
//item processing, needed as mutable
list.borrow_mut().remove(0);
}
}
这在运行时恐慌:
thread 'main' panicked at 'already borrowed: BorrowMutError', src/libcore/result.rs:997:5
我想我理解这个问题:我有两个不可变的借用,然后第三个是可变的。根据 Rust 文档,这是不允许的:许多不可变借用或单个可变借用。有没有办法解决这个问题?