Wie man eine Lebensdauer für ein Abschlussargument deklariert

8

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?

    
Peter Smit 14.07.2015, 10:12
quelle

3 Antworten

7

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:

%Vor%

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.

    
oli_obk - ker 14.07.2015, 10:55
quelle
6

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:

%Vor%

Die andere Lösung besteht darin, eine Funktion zu schreiben, die emuliert, was die Schließung macht, und stattdessen diese Funktion aufzurufen.

    
A.B. 14.07.2015 10:51
quelle
1

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.

%Vor%

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.

    
Shepmaster 13.09.2017 13:27
quelle

Tags und Links