编辑注:此代码示例来自 Rust 1.0 之前的版本,不是符合语法的 Rust 1.0 代码。更新后的代码会产生不同的错误,但答案仍包含有价值的信息。
我正在尝试在 Rust 中编写一个容器结构,其中它的元素还存储对包含容器的引用,以便它们可以调用容器上的方法。据我所知,我需要通过 Rc> 来实现这一点。这正确吗?
到目前为止,我已经有了类似以下的东西:
我正在尝试在 Rust 中编写一个容器结构,其中它的元素还存储对包含容器的引用,以便它们可以调用容器上的方法。据我所知,我需要通过 Rc> 来实现这一点。这正确吗?
到目前为止,我已经有了类似以下的东西:
struct Container {
elems: ~[~Element]
}
impl Container {
pub fn poke(&mut self) {
println!("Got poked.");
}
}
struct Element {
datum: int,
container: Weak<RefCell<Container>>
}
impl Element {
pub fn poke_container(&mut self) {
let c1 = self.container.upgrade().unwrap(); // Option<Rc>
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();
}
我感觉我在这里还少了些什么。在poke_container
中访问Rc<RefCell<T>>
的内容真的这么困难吗?或者我是在错误地解决问题吗?
最后,假设方法正确,如果我为Container
编写一个add
方法,以便它可以填充Element
中的container
字段(假设我将该字段更改为Option<Rc<RefCell<T>>>
),我不知道如何从&mut self
创建另一个Rc
。
~[~Element]
代替~[Element]
。 - Vladimir MatveevElement
是一个 trait,所以我认为在这种情况下不能省略~
。 - Kolja~
。至于问题,我不知道如何简化访问Rc
盒子内容的方式。现在就是这样工作的。希望当真正的Gc
到来时会更简单(因此不需要Weak
包装器),并且当可重写解引用可用时(无需额外的borrow()
和borrow_mut()
调用)也会更简单。 - Vladimir Matveevmain
相同)。不过我会关注Gc
的发展情况。 - Kolja