Ich würde gerne ein Leben für eine Schließung in Rust erklären, aber ich finde keine Möglichkeit, eine lebenslange Erklärung hinzuzufügen.
Dies ist meine Schließung für jetzt:
%Vor%Vollständigen Beispielcode auf dem Spielplatz .
Wie kann ich die Lebensdauer 'a
für diese Schließung erklären?
Das &mut SplitWhitespace
ist eigentlich ein &'b mut SplitWhitespace<'a>
. Die relevante Lebensdauer hier ist 'a
, da sie angibt, wie lange die Zeichenfolge schneidet, die next
live zurückgibt. Da Sie die Funktion split_whitespace
auf das Argument line
angewendet haben, müssen Sie 'a
auf dieselbe Lebensdauer wie das Argument line
setzen.
Als ersten Schritt fügen Sie eine Lebensdauer zu line
hinzu:
und dann fügen Sie die Lebensdauer zu dem Typ in Ihrem Abschluss hinzu:
%Vor%Beachten Sie, dass, während dies Ihre Frage beantwortet, die richtige Lösung für Ihr Problem die Lösung von @ AB ist.
Ich weiß nicht, wie ich Ihre Frage beantworten soll, aber es gibt zwei Möglichkeiten, das Problem zu lösen:
Am einfachsten ist es, wenn die Closure direkt auf den Iterator verweist.
%Vor% Wenn Sie danach mit tokens
eigentlich nichts anderes machen wollen, tun Sie einfach:
Die andere Lösung besteht darin, eine Funktion zu schreiben, die emuliert, was die Schließung macht, und stattdessen diese Funktion aufzurufen.
Wie ursprünglich von DK. aufgezeigt wurde, können Sie mit einer Funktion zusätzliche Einschränkungen für die Argumente eines Abschlusses und die Rückgabe anwenden Werte:
%Vor% Dies gibt Ihnen die vollen Fähigkeiten der where
-Klausel; In diesem Fall können Sie höherrangige Merkmalsbegrenzungen ( for <...>
) verwenden, um zu sagen, dass die Schließung eine Referenz derselben Lebensdauer wie das Argument zurückgeben muss.
Dies wird letztendlich verursacht durch Einschränkungen in der Rust-Typ-Inferenz . Insbesondere wenn eine Closure sofort an eine Funktion übergeben wird, die sie verwendet, kann der Compiler ableiten, was das Argument und die Rückgabetypen sind. Wenn der Compiler vor der Verwendung in einer Variablen gespeichert wird, führt er leider nicht die gleiche Inferenzstufe aus.
Diese Problemumgehung funktioniert, da sie den Abschluss sofort an eine Funktion weiterleitet und die Typen und Lebensdauerreferenzen feststellt.