6

編集者注: このコード例は、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か(フィールドをタイプに変更したと仮定しますか?私が知る限り、別のメソッドを作成することはできません.ContainercontainerElementOption<Rc<RefCell<T>>>Rc&mut self

4

1 に答える 1

1

メソッド呼び出しの長いチェーンは、「r-値」(関数呼び出しの結果など) の有効期間が変更され、一時的な戻り値がステートメントの最後まで続くように変更されているため、実際には何も変更せずにマスターで機能します。次のメソッド呼び出しの終わりよりも (古いルールがどのように機能したかのように見えました)。

ウラジミールが示唆しているように、オーバーロード可能な逆参照はおそらくそれを

self.container.upgrade().unwrap().borrow_mut().poke();

どちらがより良いです。

いずれにせよ、共有所有権を「変更」することは、単一所有権コードまたは不変の共有所有権コードのいずれかを Rust で記述するのが常に (わずかに) 難しくなります。 Rust の中心的な目標)。

于 2014-02-05T11:56:06.277 に答える