【问题标题】:Rust trying to maintain self-defined list: cannot borrow `self.array` as mutable more than once at a timeRust 试图维护自定义列表:不能一次多次借用“self.array”作为可变的
【发布时间】:2021-03-06 22:56:05
【问题描述】:

我是 rust 新手,试图在一个数组中维护 2 个链表,我的代码如下:

#[derive(Copy, Clone)]
struct Node {
    next: i32,
    prev: i32,
    val: i32
}

impl Node {

    pub fn new()->Self{
        Self{
            next: 0,
            val: 0,
            prev: 0
        }
    }
    pub fn get_prev(&self) -> i32{
        self.prev
    }

    pub fn get_next(&self) -> i32{
        self.next
    }

    pub fn set_prev(& mut self, idx: i32){
        self.prev = idx;
    }

    pub fn set_next(& mut self, idx: i32){
        self.next = idx;
    }

    pub fn get_val(&self)->i32{
        self.val
    }

    pub fn set_val(& mut self, v: i32){
        self.val = v;
    }
}

struct MyVec{
    red_start: i32,
    black_start: i32,
    data: [Node; 48]
}

impl MyVec{
    pub fn new()->Self{
        let mut ans = Self{
            red_start : -1,
            black_start: 0,
            data: [Node::new(); 48]
        };
        let len = ans.data.len();
        for i in 0..ans.data.len(){
            let n: & mut Node = & mut ans.data[i];
            n.set_prev(((i + len-1) % len) as i32);
            n.set_next(((i+1) % len) as i32);
        }
        ans
    }

    pub fn move_black_to_red(& mut self, idx: i32){
        let n: & mut Node = & mut self.data[idx as usize];
        let prev: & mut Node = & mut self.data[n.get_prev() as usize];
        let next: & mut Node = & mut self.data[n.get_next() as usize];
        prev.set_next(n.get_next());
        next.set_prev(n.get_prev());
        //other stuff...
    }
}

难点在 move_black_to_red 功能,我需要维护这个列表,所以我需要同时获取 3 个 mut 引用并更新它们。但是,从self最多借了1个mut,我该怎么办?

【问题讨论】:

    标签: rust borrowing


    【解决方案1】:

    Rust 不允许同时对同一个变量进行多个可变引用。解决这个问题的最简单方法是交错借用,并以不可变的方式借用 n,因为你永远不会改变它:

    pub fn move_black_to_red(& mut self, idx: i32){
        let n: Node = self.data[idx as usize];
    
        let prev: & mut Node = & mut self.data[n.get_prev() as usize];
        prev.set_next(n.get_next());
    
        let next: & mut Node = & mut self.data[n.get_next() as usize];
        next.set_prev(n.get_prev());
    
        //other stuff...
    }
    

    【讨论】:

    • 谢谢!没想到不是借的顺序造成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多