我正在尝试在Rust中编写一个容器结构,其中元素也存储对包含容器的引用,以便它们可以在其上调用方法.据我所知,我需要做到这一点Rc
.它是否正确?
到目前为止,我有以下内容:
struct Container { elems: ~[~Element] } impl Container { pub fn poke(&mut self) { println!("Got poked."); } } struct Element { datum: int, container: Weak> } impl Element { pub fn poke_container(&mut self) { let c1 = self.container.upgrade().unwrap(); // Option let mut c2 = c1.borrow().borrow_mut(); // &RefCell c2.get().poke(); // self.container.upgrade().unwrap().borrow().borrow_mut().get().poke(); // -> Error: Borrowed value does not live long enough * 2 } } fn main() { let container = Rc::new(RefCell::new(Container{ elems: ~[] })); let mut elem1 = Element{ datum: 1, container: container.downgrade() }; let mut elem2 = Element{ datum: 2, container: container.downgrade() }; elem1.poke_container(); }
我觉得我在这里错过了一些东西.访问的内容Rc
真的很难(在poke_container
)?或者我是以错误的方式解决问题的?
最后,并假设的做法是正确的,我怎么会写add
的方法Container
,以便它可以在填写container
领域Element
(假设我改变了场为类型Option
?我不能创建另一个Rc
从&mut self
据我所知.