Was sind die besonderen Bedingungen für eine Schließung der zu implementieren Fn
, FnMut
und FnOnce
Züge?
Das ist:
- Wann setzt eine Schließung das Merkmal nicht um
FnOnce
? - Wann setzt eine Schließung das Merkmal nicht um
FnMut
? - Wann setzt eine Schließung das Merkmal nicht um
Fn
?
Wenn Sie beispielsweise den Status des Abschlusses auf seinem Body ändern, wird der Compiler nicht darauf implementiert Fn
.
Antworten:
Die Merkmale repräsentieren jeweils immer restriktivere Eigenschaften von Verschlüssen / Funktionen, die durch die Signaturen ihrer
call_...
Methode und insbesondere die Art vonself
:FnOnce
(self
) sind Funktionen, die einmal aufgerufen werden könnenFnMut
(&mut self
) sind Funktionen, die aufgerufen werden können, wenn sie&mut
Zugriff auf ihre Umgebung habenFn
(&self
) sind Funktionen, die aufgerufen werden können, wenn sie nur&
Zugriff auf ihre Umgebung habenEin Abschluss
|...| ...
implementiert automatisch so viele davon wie möglich.FnOnce
: Ein Verschluss, der nicht einmal aufgerufen werden kann, verdient den Namen nicht. Beachten Sie, dass ein Abschluss, der nur implementiert wirdFnOnce
, nur einmal aufgerufen werden kann.FnMut
, sodass sie mehrmals aufgerufen werden können (wenn ein unvoreingenommener Zugriff auf das Funktionsobjekt besteht).Fn
, sodass sie im Wesentlichen überall aufgerufen werden können.Diese Einschränkungen ergeben sich direkt aus der Art
self
und dem "Desugaring" von Verschlüssen in Strukturen; beschrieben in meinem Blog-Beitrag Finding Closure in Rust .Informationen zu Schließungen finden Sie unter Schließungen : Anonyme Funktionen, die ihre Umgebung in der Programmiersprache Rust erfassen können .
quelle
FnOnce
, bedeutet dies, dass er nur einmal aufgerufen werden kann?FnOnce
".