Ich habe eine Struktur, die innere Veränderlichkeit hat.
%Vor%Erzeugt den Fehler:
%Vor% Das Problem ist, dass ich keine Funktion für Foo
haben kann, die ein entliehenes vec
zurückgibt, weil das entliehene vec
nur für die Lebenszeit von Ref
gilt, aber das Ref
geht außerhalb des Geltungsbereichs sofort.
Ich denke, das Ref
muss sich da befinden:
RefCell nutzt Rusts Lebenszeiten, um "dynamisches Borrowing" zu implementieren, ein Prozess, bei dem man temporären, exklusiven, veränderbaren Zugriff auf den inneren Wert beanspruchen kann. Ausleihen für RefCells werden "zur Laufzeit" verfolgt, im Gegensatz zu den systemeigenen Referenztypen von Rust, die zur Kompilierungszeit vollständig statisch verfolgt werden. Da RefCell-Kredite dynamisch sind, kann versucht werden, einen Wert auszuleihen, der bereits variabel ausgeliehen ist. Wenn dies passiert, führt dies zu einer Task-Panik.
Nun könnte ich stattdessen eine Funktion wie diese schreiben, die das gesamte Innere zurückgibt:
%Vor% Dies setzt jedoch möglicherweise Felder frei ( MutableInterior.hideMe
in diesem Beispiel), die wirklich private Implementierungsdetails sind, auf Foo
.
Idealerweise möchte ich nur das vec
selbst offenlegen, möglicherweise mit einem Wächter, um das dynamische Ausleihverhalten zu implementieren. Dann müssen Anrufer nichts über hideMe
herausfinden.
Sie können eine neue Struktur ähnlich der von Ref<'a,T>
zurückgegebenen RefCell::borrow()
-Wache erstellen, um diese Ref
zu umbrechen und zu vermeiden, dass sie den Gültigkeitsbereich verlässt, wie folgt:
Dann können Sie das Merkmal Deref
dafür implementieren, so dass es so verwendet werden kann, als wäre es ein &Vec<i32>
:
Danach aktualisieren Sie einfach Ihre getItems()
-Methode, um eine FooGuard
-Instanz zurückzugeben:
und Deref
macht die Magie:
Tags und Links mutability rust