Wie gebe ich einen Verweis auf etwas in einer RefCell zurück, ohne die Kapselung zu unterbrechen?

9

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.

    
Drew 01.04.2015, 22:02
quelle

1 Antwort

15

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:

%Vor%

Dann können Sie das Merkmal Deref dafür implementieren, so dass es so verwendet werden kann, als wäre es ein &Vec<i32> :

%Vor%

Danach aktualisieren Sie einfach Ihre getItems() -Methode, um eine FooGuard -Instanz zurückzugeben:

%Vor%

und Deref macht die Magie:

%Vor%     
Levans 01.04.2015, 22:19
quelle

Tags und Links