< 返回版块

lz77 发表于 2024-05-01 00:00

use typed_arena::Arena;
use std::cell::Cell;

struct ListEntry<'arena>{
    #[allow(unused)]val: u32,
    ne: Cell<Option<&'arena ListEntry<'arena>>>,
    pre: Cell<Option<&'arena ListEntry<'arena>>>
}

impl ListEntry<'_> {
    pub fn new(val: u32) -> Self{
        Self{
            val,
            ne: Cell::new(None),
            pre: Cell::new(None)
        }
    }
}

struct List<'arena>{
    arena: Arena<ListEntry<'arena>>,
    head: Option<&'arena ListEntry<'arena>>,
    
}


impl<'arena> List<'arena> {
    pub fn new()-> Self{
        Self{
            arena: Arena::new(),
            head: None
        }
    }
    pub fn add(&'arena mut self, val: u32){
        let t = self.head.take();
        let new_e = self.arena.alloc(ListEntry::new(val));
        new_e.ne.set(t);
        if let Some(head_e) = t{
            head_e.pre.set(Some(new_e))
        }

        self.head = Some(new_e)
    }

}



fn main(){
    let mut list = List::new();
    list.add(0);
    list.add(1);
}

编译器的报错

  --> src\main.rs:52:5
   |
51 |     list.add(0);
   |     ---- first mutable borrow occurs here
52 |     list.add(1);
   |     ^^^^
   |     |
   |     second mutable borrow occurs here
   |     first borrow later used here

请求大佬指点

评论区

写评论
nemolc 2024-05-06 15:25
use typed_arena::Arena;
use std::cell::Cell;


struct ListEntry<'arena> {
    #[allow(unused)]val: u32,
    next: Cell<Option<&'arena ListEntry<'arena>>>,
    pre: Cell<Option<&'arena ListEntry<'arena>>>,
}

impl ListEntry<'_> {
    pub fn new(val: u32) -> Self {
        Self {
            val,
            next: Cell::new(None),
            pre: Cell::new(None),
        }
    }
}

struct List< 'arena> {
    arena: Arena<ListEntry<'arena>>,
    head: Cell<Option<&'arena ListEntry<'arena>>>,
}


impl<'arena> List<'arena> {
    pub fn new() -> Self {
        Self {
            arena: Arena::new(),
            head: Cell::new(None),
        }
    }

    pub fn add(&'arena self, val: u32) {
        let t = self.head.take();
        let new_e: &ListEntry = self.arena.alloc(ListEntry::new(val));
        if let Some(head_e) = t {
            head_e.pre.set(Some(new_e))
        }

        new_e.next.set(t);

        self.head.set(Some(new_e));
    }
}


fn main() {
    let  list = List::new();
    list.add(0);
    list.add(0);
}


github.com/shanliu/lsys 2024-05-03 13:30

&'arena mut self 的生命周期绑到结构上,狠人。 直接mut self ,把所有权传进去在传出来,更好看一点。为什么要引用呢。。。。

👇
aj3n: ``` pub fn add(&'arena mut self, val: u32)

这里&mut self带'arena生命周期就不能这么调用,如果删掉的话,方法内部就又报错;

你想要这么实现双链表的话, arena应该不能放在List内部,需要通过引用的方式new的时候传进来;

<https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=22346246b9676a4bfdfbd5cde72ef1ff>

改了一下能编译通过了,但是应该不是你一开始想要的,不确定有无更好的方案,再探索下吧;
aj3n 2024-05-01 03:31
pub fn add(&'arena mut self, val: u32)

这里&mut self带'arena生命周期就不能这么调用,如果删掉的话,方法内部就又报错;

你想要这么实现双链表的话, arena应该不能放在List内部,需要通过引用的方式new的时候传进来;

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=22346246b9676a4bfdfbd5cde72ef1ff

改了一下能编译通过了,但是应该不是你一开始想要的,不确定有无更好的方案,再探索下吧;

1 共 3 条评论, 1 页