Ist es möglich, Schließungen über Kanäle zu senden?

8

Ich möchte eine Schließung über Kanäle senden:

%Vor%

( Spielplatz )

Ich bekomme eine Reihe von Fehlern:

%Vor%

Es scheint, dass FnOnce nicht sendbar ist, aber ich verstehe nicht warum.

    
Maik Klein 31.05.2015, 11:59
quelle

2 Antworten

9

Ja. Es gibt ein paar Probleme mit Ihrem Code.

Erstens ist FnOnce ein Merkmal, also können Sie es nicht direkt verwenden. Traits müssen entweder eine Beschränkung auf einen konkreten Typ oder eine Art Indirektion sein. Da Sie die Schließung an einen anderen Ort senden, wollen Sie etwas wie Box<FnOnce(...)> .

Zweitens können Sie Box<FnOnce(...)> nicht verwenden, weil Sie aufgrund von Objektsicherheitsregeln nicht eine FnOnce durch eine Indirektion aufrufen können.

(Nebenbei, Sie möchten auch nicht die FnOnce<...> -Syntax verwenden, die technisch instabil ist; verwenden Sie stattdessen FnOnce(...) .)

Um dies zu lösen, können Sie entweder zu Fn oder FnMut wechseln oder das noch nicht-stabile FnBox Merkmal verwenden. Ich bin diesen Weg auf der Grundlage gegangen, dass er wahrscheinlich die von Ihnen gewünschte Semantik hat und wahrscheinlich in naher Zukunft stabilisiert wird. Wenn Sie sich damit nicht wohl fühlen, müssen Sie Ihren Verschluss entsprechend modifizieren.

Das Folgende ist eine gemeinsame Anstrengung zwischen mir und Manishearth (der darauf hinwies, dass ich die Einschränkung + Send verpasst hatte):

%Vor%     
DK. 31.05.2015, 12:25
quelle
1

Die angenommene Antwort geht nicht ins Detail, aber Sie können Schließungen an Threads über Channels senden, sogar an stable, wenn Sie FnOnce nicht verwenden:

%Vor%     
Doug 06.03.2018 03:19
quelle

Tags und Links