Das folgende Code-Snippet macht die gleichen Dinge auf drei Arten.
%Vor% show3
kompiliert nicht und gibt den folgenden Fehler aus:
Soweit ich es erzähle, handelt es sich bei dem Problem mit show3
nicht um Veränderbarkeit, sondern um einen doppelten Borgen: Das Borging von self
wird an get_cached
vergeben, das nicht endet, weil get_cached
a zurückgibt Verweis auf etwas, das in self
enthalten ist. Ist das überhaupt richtig?
Wie kann ich mein beabsichtigtes Ziel erreichen, einen Wert in einem veränderbaren Cache in self nachzuschlagen und den Verweis auf eine andere Methode von self zu übergeben?
Rust kann im Moment nicht mit dieser Art von Caching umgehen.
Die beste Lösung besteht darin, das Problem vollständig zu vermeiden. Muss show_impl
wirklich eine Methode von Foo
sein? Wenn nicht, können Sie ein neues Merkmal definieren und für String
implementieren. Zum Beispiel:
Rufen Sie dann show_impl
in der Zeichenfolge self.get_cached(key).show_impl();
Hier ist eine Lösung, die UnsafeCell
verwendet. Ich bin mir nicht sicher, ob es richtig funktioniert. Während der Kompilierung, die Verwendung von unsicheren Code bedeutet, dass der Compiler keine Sicherheit mehr garantieren kann.
Sie könnten versuchen, &mut
auf self
auf show_impl
wie in
So wird es nicht gemischt.
Tags und Links rust