Ich kann das nicht kompilieren, ohne eine Schließung zu verwenden. Ich versuche, die Funktion %code% zu erhalten, um die korrekte Art der Schließung an erster Stelle zurückzugeben.
%Vor%Was kann ich tun, damit %code% so funktioniert, wie ich es möchte?
Zunächst möchte ich sagen, dass das Problem nichts mit der Syntax %code% zu tun hat. Ich habe die Schließung in eine benannte Struktur umgewandelt und die gleichen Ergebnisse erhalten.
Sehen wir uns nun den Code an, mit dem Sie arbeiten möchten:
%Vor%Was sagt der Compiler dazu?
%Vor%OK, also haben wir den Typ X und er muss das Merkmal Y implementieren, tut es aber nicht. Aber schauen wir genau hin:
%Vor%Ah ha! %code% erwartet eine Funktion, die einen Verweis auf einen Verweis auf ein Tupel akzeptiert, während die Funktion, die wir übergeben, einen Verweis auf ein Tupel akzeptiert. %code% übergibt eine Referenz an eine Referenz, weil %code% über Referenzen iteriert, und %code% übergibt Referenzen an diese Referenzen.
Okay, lassen Sie uns die Definition von %code% so ändern, dass Referenzen auf Referenzen akzeptiert werden:
%Vor%Der Compiler ist immer noch nicht glücklich:
%Vor%%code% ... Was bedeutet das?
Der Typ%code% ist ein Typ, der %code% implementiert. Im Aufruf von %code% , %code% und %code% . Beachten Sie, dass %code% hier ein fester Typ ist; %code% repräsentiert eine feste Lebensdauer, die eine konkrete Lebensdauer genannt wird.
Schauen wir uns die Signatur von %code% an:
%Vor%Hier muss %code% %code% implementieren. Eigentlich ist diese Syntax eine Abkürzung für %code% . Hier. %code% ist ein gebundener Lebensdauerparameter.
Das Problem ist also, dass unsere Funktion, die %code% implementiert, nicht %code% implementiert. Wir benötigen eine Funktion, die %code% implementiert. Der einzige Weg, dies zu tun, wäre im Moment, %code% so zu schreiben:
%Vor%oder die explizitere Version:
%Vor%Wenn Rust schließlich höherstufige Typen , dort könnte ein eleganterer Weg sein, um dieses Problem zu lösen.