2

すべての州のハッシュマップがあります。これは でありHashMap<String, Rc<State>>、現在の州のメンバーを呼び出したいと考えていますfn init(&mut self)。しかし、次のコードでエラーが発生します。

...
if let Some(state) = self.states.get_mut(state_id) {
    (*state).init();
}
...

エラーは次のとおりです。

src/main.rs:70:25: 70:33 error: cannot borrow immutable borrowed content as mutable
src/main.rs:70                         (*state).shutdown();`

ドキュメントからわかるように、問題はget_mut、可変状態への参照ではなく、状態への可変参照を返すことです。では、可変状態への参照を取得するにはどうすればよいでしょうか。

4

1 に答える 1

6

Rust の基本的な考え方は、エイリアシングまたはミュータビリティのいずれかですが、両方ではありません。

エイリアシングとは、同じ値への複数のアクティブなポインターを持つことを意味します。

とはRc<T>? 所有権を共有し、値をエイリアシングしています。したがってRc<T>、内部の値を変更することはできません。

またはのような型で内部可変Rc性を使用することで、これを回避する方法があります。Cell<U>RefCell<U>

(マルチスレッド プログラムを作成する場合は、スレッド セーフな共有所有権/エイリアシングを使用し、代わりにスレッド セーフな内部可変Arc性を使用できます。)Mutex<U>

  • Rc<Cell<U>>U書き込みと読み取りのみを許可することで変更を許可しますが、内部値へのポインターは許可しませんU。ポインターもエイリアシングもありません!

  • Rc<RefCell<U>>.borrow_mut()実行時に借用カウントを保持し、変更可能な借用が排他的であることを動的に確認するメソッドによる変更を許可します。エイリアシングはありません。可変性があります。

リンク

于 2015-08-03T16:41:45.020 に答える