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
Irgendeine Idee, wie das funktioniert?
( Laufgitter-Link )
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:
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:
Aber leider ist das ab Rust 1.7 nicht legal.