Hier ist ein Beispiel von Rust by Example:Warum sollten Sie `FnMut` verwenden, wenn das Argument nach Wert genommen wird?
pub trait Iterator {
// The type being iterated over.
type Item;
// `any` takes `&mut self` meaning the caller may be borrowed
// and modified, but not consumed.
fn any<F>(&mut self, f: F) -> bool where
// `FnMut` meaning any captured variable may at most be
// modified, not consumed. `Self::Item` states it takes
// arguments to the closure by value.
F: FnMut(Self::Item) -> bool {}
}
Warum FnMut
plagt, zu verwenden, wenn das Argument von Wert genommen wird, da das Argument nicht sowieso mutiert werden kann? In der Tat, warum ist FnMut
sogar hier erlaubt? Es scheint nur FnOnce
is permitted to do this:
Es wurde festgestellt, dass Rust wählt, wie Variablen auf dem fly ohne Anmerkung zu erfassen. Dies ist in der normalen Verwendung sehr praktisch , aber beim Schreiben von Funktionen ist diese Mehrdeutigkeit nicht erlaubt. Der vollständige Typ des Abschlusses , einschließlich des Erfassungstyps, muss kommentiert sein.
Fn
:: durch Verweis (&T
) hat CapturesFnMut
: nimmt Captures durch veränderbare Referenz (&mut T
)FnOnce
Die Art und Weise der Erfassung ein Verschluss verwendet, wie ein von folgendentrait
s ist kommentieren : nimmt Aufnahmen von Wert (T
)
Was meinen Sie mit "das Argument wird von Wert genommen"? Sprechen Sie über 'f: F'? –
Ja. F nimmt Argument nach Wert. – qed
Können Sie erklären, was Sie tun sollten, anstatt 'FnMut' zu verwenden? –