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
请求大佬指点
1
共 3 条评论, 1 页
评论区
写评论&'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
改了一下能编译通过了,但是应该不是你一开始想要的,不确定有无更好的方案,再探索下吧;