多次借用的借用错误

问题描述 投票:0回答:1

我正在 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 中复制它,但我遇到了问题。任何帮助将不胜感激。

rust
1个回答
4
投票

您尝试做的事情是不合理的。看起来您正在尝试创建多个

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!

© www.soinside.com 2019 - 2024. All rights reserved.