我正在 Rust 中实现一个就地递归解析器,但遇到了一些借用错误。代码片段重现了问题,尽管它不是很有用
use std::vec::Vec;
struct MyBorrows<'a> {
val : &'a mut i32
}
impl <'a> MyBorrows<'a> {
fn new(v : &'a mut i32) -> MyBorrows<'a> {
MyBorrows { val : v }
}
}
fn main() {
let mut my_val = 23;
let mut my_vec : Vec<Box<MyBorrows>> = Vec::new();
my_vec.push(Box::new(MyBorrows::new(&mut my_val)));
for i in [1..4].iter() {
let mut last : &mut Box<MyBorrows> = my_vec.last_mut().unwrap();
let mut new_borrow = Box::new(MyBorrows::new(last.val));
my_vec.push(new_borrow);
}
}
这给了我以下错误:
错误[E0499]:一次不能多次借用`my_vec`作为可变的 --> 测试.rs:20:9 | 18 |让 mut 最后: &mut Box = my_vec.last_mut().unwrap(); | ------ 第一个可变借用发生在这里 19 | 19让 mut new_borrow = Box::new(MyBorrows::new(last.val)); 20 | 20 my_vec.push(new_borrow); | ^^^^^^ 第二个可变借用发生在这里 21 | 21 } 22 | 22 } | - 第一次借到这里结束 错误:由于之前的 3 个错误而中止
在我的实际情况中,向量用作堆栈来引用我正在解析的
struct
越来越深的组件。这是我在 C++ 中用于通用解析的常见模式,我试图在 Rust 中复制它,但我遇到了问题。任何帮助将不胜感激。
您尝试做的事情是不合理的。看起来您正在尝试创建多个
MyBorrows
,它们都可变地借用相同的值,并让它们同时处于活动状态(在向量中)。这样的设置正是 Rust 旨在防止的,因为这就是数据竞争的发生方式。
您可能想做的是im可变地借用一堆值,这是合法的。因此,在清理了不必要的可变借用之后,我将问题简化为:
struct MyBorrows<'a> {
val : &'a i32
}
impl <'a> MyBorrows<'a> {
fn new(v : &'a i32) -> MyBorrows<'a> {
MyBorrows { val : v }
}
}
fn main() {
let my_val = 23;
let mut my_vec = vec![];
my_vec.push(Box::new(MyBorrows::new(&my_val)));
for _ in 1..4 {
let last = my_vec.last().unwrap();
let new_borrow = Box::new(MyBorrows::new(last.val));
my_vec.push(new_borrow);
}
}
这适用于具有非词汇生命周期的现代 Rust!