編集者注: このコード例は、Rust 1.0 より前のバージョンのものであり、構文的に有効な Rust 1.0 コードではありません。このコードの更新されたバージョンではさまざまなエラーが生成されますが、回答には依然として貴重な情報が含まれています。
Rust でコンテナー構造を作成しようとしています。その要素には、含まれているコンテナーへの参照も格納されているため、メソッドを呼び出すことができます。私が理解できる限り、これを介して行う必要がありますRc<RefCell<T>>
。これは正しいです?
これまでのところ、次のようなものがあります。
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();
}
ここで何かが欠けているように感じます。のコンテンツにアクセスするのはRc<RefCell<T>>
本当に難しいですか ( でpoke_container
)? それとも、私は間違った方法で問題に取り組んでいますか?
最後に、アプローチが正しいと仮定すると、フィールドに入力できるようにメソッドを作成するにはどうすればよいですadd
か(フィールドをタイプに変更したと仮定しますか?私が知る限り、別のメソッドを作成することはできません.Container
container
Element
Option<Rc<RefCell<T>>>
Rc
&mut self