trait-objects

___ tag123rust ___ Rust ist eine Sprache, die für das Schreiben von sehr zuverlässiger und schneller Software auf einfache Weise entwickelt wurde. Es kann von High-Level-Code bis zu hardwarespezifischem Code und von großen Eisen zu kleinen Geräten verwendet werden. ___ qstnhdr ___ Funktion, die eine Schließung in meinem Filter nicht funktioniert ___ tag123closures ___ Eine Closure ist eine First-Class-Funktion, die auf Variablen aus dem Bereich verweist, in dem sie definiert wurde. Wenn der Abschluss noch existiert, nachdem sein definierender Bereich endet, bleiben die Variablen, die er schließt, weiterhin bestehen. ___ tag123attributobjekte ___ hilf uns dieses Wiki zu bearbeiten ___ qstntxt ___

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?

    
___ answer39542472 ___

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.

    
___
1
Antwort

Funktion, die eine Schließung in meinem Filter nicht funktioniert

Ich kann das nicht kompilieren, ohne eine Schließung zu verwenden. Ich versuche, die Funktion apply zu erhalten, um die korrekte Art der Schließung an erster Stelle zurückzugeben. %Vor% Was kann ich tun, damit apply so funktioniert, wi...
16.09.2016, 23:19