Ich habe den folgenden Code ( Spielplatz ):
%Vor%Die folgenden Fehler treten auf:
%Vor%Ich habe eine Liste geladener Objekte und eine Liste von Objekten in einer Datenbank. Ich brauche eine Funktion, die eine Schließung nimmt und sie an den geladenen Objekten ausführt. Wenn wir die Objekte in der Liste nicht haben, führe sie auf einer Liste von Objekten aus der Datenbank aus.
Diese Funktion sieht folgendermaßen aus:
%Vor%Wir müssen Objekte aus der Datenbank nur bearbeiten, wenn wir sie nicht in der Laufzeitliste finden konnten. Deshalb habe ich beschlossen, eine Variable zu erstellen, die besagt: "Wir haben diese Objekte bereits in der Liste gefunden, lassen Sie die Datenbank in Ruhe".
Ändere deine perform_for_all
-Funktion, um FnMut anstelle von Fn :
Wie Peter sagte , gibt es einige Compilermagie.
Die Signatur für call
( Fn
) lautet:
Wie Sie sehen, nimmt dies einen unveränderlichen Verweis auf self
.
Aus diesem Grund können Sie keine der erfassten Variablen ändern.
Mit der Signatur für call_mut
( FnMut
) können Sie das tun, denn es dauert &mut self
:
Wenn Sie also Ihre Schließung von Fn
nach FnMut
ändern, erlauben Sie ihr, ihre erfassten Variablen zu ändern, da die Referenzen, die Sie übergeben, veränderbar sind.
Nur ein wenig auf SplittyDevs Antwort zu erweitern.
Wenn Sie eine Closure verwenden, macht der Compiler ein wenig Magie, damit die Closure auf Variablen in ihrer Umgebung zugreifen kann. Effektiv wird es eine neue Struktur erstellen, deren Mitglieder die Variablen sind, auf die Sie versucht haben zuzugreifen.
Es ist nicht genau das (was nicht wirklich kompiliert wird), aber es ist konzeptionell eine vernünftige Annäherung:
%Vor% Und wenn Sie es aufrufen, werden diese Variablen ausgeliehen oder kopiert (oder verschoben, wenn Sie move
keyword verwenden).
Wenn der Abschluss seine Umgebung ändert, kann es kein Fn
sein, weil er auch die Variablen für sich selbst mutieren muss:
Siehe Die Rust Programmiersprache Abschnitt über Schließungen und ihre Umgebung für weitere Informationen.
Tags und Links rust