Brauchen ganzheitliche Erklärung über Rost Zelle und Referenz-Arten gezählt
Gibt es verschiedene wrapper-Typen im Rost standard-Bibliothek:
- Die Zellen in der
std::cell
- Modul:Zelle
undRefCell
- Die Referenz-gezählt-Wrapper, wie
Rc
undArc
. - Die Typen in der
std::sync
- Modul:Mutex
oderAtomicBool
zum Beispiel
Wie ich es verstehe, diese sind Wrapper, die weitere Möglichkeiten als eine einfache Referenz. Ich verstehe zwar einige Grundlagen, ich kann nicht das ganze Bild zu sehen.
Was tun Sie eigentlich genau? Werden Zellen und Referenz-gezählten Familien stellen orthogonale oder ähnliche features?
- Bitte beschreiben Sie, was Sie nicht verstehen. Die Dokumentation, die du verlinkt hast, hat hatte Hunderte (oder Tausende) von Menschen Lesen es, und wahrscheinlich zig bis Hunderte Leute dazu beitragen. Was können wir vielleicht sagen, das wäre anders aus, was bereits gesagt ist, vor allem, wenn du uns nicht sagst was du nicht verstehst?
- Die Erklärungen in der Dokumentation sprechen über innere Wandlungsfähigkeit. Dieses Konzept ist unklar für mich. Vielleicht war meine Frage unklar zu.
- Eine schnelle Suche im internet gefunden ein Kapitel in dem Buch über das innere Veränderlichkeit, eine blog post und SO Frage. Vielleicht ist jetzt, dass Sie wissen, was Sie unklar, können Sie einige der Forschung und aktualisieren Sie Ihre Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei wesentliche Konzepte, die in Rust:
Die verschiedenen Zeiger-Typen (
Box
,Rc
,Arc
) befassen sich mit Eigentum: Sie erlauben die Steuerung, ob es eine einzige oder mehrere Eigentümer für ein einzelnes Objekt.Auf der anderen Seite, die verschiedenen Zellen (
Cell
,RefCell
,Mutex
,RwLock
,AtomicXXX
) betroffen sind mit Veränderlichkeit.Der Gründung die Regel der Rost die Sicherheit Aliasing XOR Veränderlichkeit. Das heißt, ein Objekt kann nur sicher mutiert, wenn es keine herausragende Referenz in seinem inneren.
Diese Regel ist in der Regel erzwungen, die zur compile-Zeit durch den borrow checker:
&T
Sie können auch eine&mut T
auf das gleiche Objekt im Rahmen,&mut T
Sie können auch eine beliebige Referenz auf das gleiche Objekt im scope.Manchmal jedoch, dies ist nicht flexibel genug. Manchmal Sie TUN müssen (oder wollen) die Möglichkeit, mehrere Referenzen auf das gleiche Objekt und dennoch mutieren Sie. Geben Sie die Zellen.
Die Idee
Cell
undRefCell
zu ermöglichen, ist Veränderlichkeit in der Gegenwart von aliasing - in einer kontrollierten Art und Weise:Cell
verhindert die Bildung von Referenz in seinem inneren, die Vermeidung von dangling references,RefCell
Schichten, die Durchsetzung der Aliasing XOR Veränderlichkeit von der Kompilierung zur Laufzeit.Diese Funktionalität wird manchmal beschrieben, wie die Bereitstellung von innere Veränderlichkeit, das ist, wo ein Objekt, das sonst aussieht unveränderbar von außen (
&T
) kann tatsächlich mutiert.Wenn diese Veränderlichkeit erstreckt sich über mehrere threads, die Sie stattdessen verwenden
Mutex
,RwLock
oderAtomicXXX
; Sie bieten die gleiche Funktionalität:AtomicXXX
sind nurCell
: keine Referenz auf das innere, nur das verschieben in/out,RwLock
ist nurRefCell
: erhalten Verweise auf den Innenraum durch Wachen,Mutex
ist eine vereinfachte version desRwLock
die nicht unterscheiden zwischen einem nur-lese-guard und schreiben Sie guard; so konzeptionell ähnlich wie einRefCell
mit nur einemborrow_mut
Methode.Wenn Sie kommen aus einem C++ - hintergrund:
Box
istunique_ptr
,Arc
istshared_ptr
,Rc
ist eine nicht thread-sichere version vonshared_ptr
.Und die Zellen bieten eine ähnliche Funktionalität wie
mutable
nur mit zusätzlichen Garantien zur Vermeidung von aliasing-Probleme; denkenCell
alsstd::atomic
undRefCell
als eine nicht thread-sichere version vonstd::shared_mutex
(die wirft statt blockieren, wenn die Sperre).Cell
tut, aber diese Art von Erklärung ist unnötig. Es muss nicht erklärt werden, wie eine Akademische Beweis.Dank Matthieu ist gute Antwort, ist hier ein Diagramm, um zu helfen Leute zu finden die wrapper, die Sie benötigen:
T
ersetzt werden kann, mitBox<T>
AtomicT
wennT
ist einbool
oder eine ReiheWissen, ob Sie verwenden sollten
Mutex
oderRwLock
finden Sie in diesem Zusammenhang Frage.