Lebenszeit-Problem mit höherem Rang und gebundener Schließung

8

Ich versuche, eine Funktion zu schreiben, die eine Box-Schließung zurückgibt, die mit Referenzen auf Typen mit irgendwelchen arbeiten kann Lebenszeit. Beim Schreiben einer bestimmten Instanz funktioniert alles einwandfrei. Aber wenn man ein generisches schreibt Version habe ich lebenslange Probleme.

%Vor%

Ich verstehe nicht, warum die Schließung den Typparameter braucht, um länger zu leben (es gibt keinen Speicher oder irgendetwas ...). Und es funktioniert für die nicht-generische Version mit HRTB, es fühlt sich einfach so an, als ob es möglich wäre, es mit der generischen Version arbeiten zu lassen.
Wenn ich versuche, die spezifische Version mit der generischen Version zu schreiben, erhalte ich einen Typfehler

%Vor%

Irgendeine Idee, wie das funktioniert?

( Laufgitter-Link )

    
Vaelden 01.03.2016, 00:07
quelle

1 Antwort

6

Typparameter haben eine Lebensdauergrenze. Diese Lebensdauergrenze ist der kürzeste aller Lebensdauerparameter des Implementierers. Sie haben es in generate_closure_gen weggelassen, also hat der Compiler es abgeleitet, aber wenn wir es explizit ausgeschrieben haben, würde die Funktionsdefinition so aussehen:

%Vor%

Diese Änderung löst jedoch unser Problem nicht.

Um zu verstehen warum, müssen wir herausfinden, was C ist. Sie nennen den Abschluss mit &'y Parameter<'x> und der Abschluss akzeptiert for<'b> &'b C , also C ist Parameter<'x> . Parameter<'x> hat einen Lebensdauerparameter, der einen Einfluss auf die Lebensdauer hat, die an C gebunden ist.

Lebensdauerparameter in generischen Funktionen müssen durch Lebenszeiten ersetzt werden, die vor dem Funktionsaufruf beginnen. In diesem Fall bedeutet dies, dass die Lebensdauer von C , die wir an den Abschluss übergeben, vor dem Aufruf von generate_closure_gen gültig sein muss. Das liegt daran, dass C an eine bestimmte Lebensdauer und nicht an eine bestimmte Lebensdauer gebunden ist. wenn C ist Parameter<'x> , muss 'x im Voraus bekannt sein; Wir können nicht jedes Mal 'x haben, wenn wir die Schließung aufrufen. Mit anderen Worten, was Sie haben möchten, ist in etwa so:

%Vor%

Aber leider ist das ab Rust 1.7 nicht legal.

    
Francis Gagné 14.03.2016, 04:18
quelle

Tags und Links