Rcの使い方を理解する > Rustで質問する

Rcの使い方を理解する > Rustで質問する

私はいくつかのコードを見ています

Rc<RefCell<SomeStruct>>

そこで、Rc と RefCell の違いについて調べてみました。

Box、Rc、または RefCell を選択する理由を以下にまとめます。

Rc では同じデータの複数の所有者が許可されますが、Box と RefCell では所有者は 1 人だけです。

Box では、コンパイル時にチェックされる不変または可変の借用が許可されます。Rc では、コンパイル時にチェックされる不変の借用のみが許可されます。

RefCell では、実行時にチェックされる不変または可変の借用が許可されます。RefCell では実行時にチェックされる可変の借用が許可されるため、RefCell が不変の場合でも、RefCell 内の値を変更できます。

したがって、同時に多くの人がアクセスできるようRcにします。しかし、どのようにアクセスするのでしょうか?変更可能な参照を返すメソッドしか表示されません。ただし、テキストでは「Rc は不変の借用のみを許可します」と説明されています。SomeStructget_mut

Rc のオブジェクトに mut と not mut の方法でアクセスできる場合、なぜ RefCell が必要なのでしょうか?

ベストアンサー1

つまり、多くの人が同時にアクセスできるRcようにします。しかし、どうやってアクセスするのでしょうか?SomeStruct

x逆参照により。型の変数がある場合Rc<...>、 を使用して内部の値にアクセスできます*x。多くの場合、これは暗黙的に行われます。たとえば、 のメソッドはxだけで呼び出すことができますx.method(...)

可変参照を返すメソッドしか見当たりませんget_mut。しかし、テキストでは「Rc不変の借用のみを許可する」と説明されています。

メソッドは、不変借用のみを許可するget_mut()という説明よりも新しいものと思われますRc。さらに、現在内部値の所有者が 1 人しかいない場合、つまり、そもそも現在必要ない場合のみ、可変借用を返しますRc。所有者が複数になると、get_mut()は を返しますNone

Rcのオブジェクトに mut の方法でアクセスすることも、 mut の方法でアクセスすることも可能な場合、なぜ がRefCell必要なのでしょうか?

RefCellを使用すると、複数の所有者が存在する場合でも、また への共有参照のみを保持している場合でも、可変アクセスを取得できますRefCell。 は、実行時に、任意の時点で存在する可変参照が 1 つだけであることを動的にチェックし、2 つ目の同時参照を要求するとパニックになります (または、 メソッドの場合はそれぞれ return と error になりますtry_borrow)。この機能は では提供されていませんRc

Rcまとめると、共有所有権内部値には複数の所有者がおり、参照カウントにより、少なくとも1人の所有者が保持している限り、データが存続することが保証されます。これは、データに明確な単一の所有者がいない場合に役立ちますRefCell内部の可変性つまり、実行時に内部の値を動的に借用し、共有参照を使用して変更することができます。この組み合わせにより、Rc<RefCell<...>>両方の組み合わせ、つまり複数の所有者を持つ値が得られ、その値は所有者のいずれかによって変更可能に借用できます。

詳細については、Rust の本の関連章をお読みください。

おすすめ記事