Rückgabe einer Schließung von einer Funktion
Hinweis: Diese Frage wurde vor Rost die erste stabile Version. Es wurden viele Veränderungen da und die syntax verwendet, in der Funktion ist auch nicht mehr gültig. Noch, Shepmaster die Antwort ist ausgezeichnet und macht diese Frage lohnt sich.
Schließlich ohne Verpackung Verschlüsse gelandet, so bin ich mit Ihnen zu Experimentieren, um zu sehen, was Sie tun können.
Habe ich diese einfache Funktion:
fn make_adder(a: int, b: int) -> || -> int {
|| a + b
}
Allerdings bekomme ich eine missing lifetime specifier [E0106]
Fehler. Ich habe versucht, dieses Problem beheben, indem ändern Sie den Rückgabetyp zu ||: 'static -> int
, aber dann bekomme ich eine andere Fehlermeldung cannot infer an appropriate lifetime due to conflicting requirements
.
Wenn ich das richtig verstehe, ist der Verschluss ohne Verpackung, so dass es besitzt a
und b
. Es scheint sehr seltsam für mich, die es braucht, ein Leben lang. Wie kann ich dieses Problem beheben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als der Rost 1.26, können Sie
impl trait
:Dies ermöglicht die RÜCKFÜHRUNG einer ohne Verpackung Schließung, obwohl es unmöglich ist, spezifizieren Sie den genauen Typ der Schließung.
Diese wird nicht Ihnen helfen, wenn alle diese Bedingungen erfüllt sind:
Sind Sie targeting Rost, bevor Sie diese version
Müssen Sie jede Art von bedingten in Ihrer Funktion:
Hier gibt es nicht einen einzigen return Typ; jeder Verschluss hat einen einzigartigen, un-namhafte-Typ.
Müssen Sie in der Lage sein, um den Namen der zurückgegebene Typ von Gründen:
Können Sie nicht (noch) verwenden
impl SomeTrait
als Typ einer Variablen.In diesen Fällen müssen Sie die Möglichkeit zur Dereferenzierung. Die gemeinsame Lösung ist eine Merkmal Objekt, wie beschrieben in die andere Antwort.
Es ist möglich, Rückkehr Verschlüsse innen
Box
es, das ist, als Eigenschaft von Objekten der Durchführung bestimmter Charakterzug:(versuchen Sie es hier)
Gibt es auch ein RFC - (die tracking-Problem) auf hinzufügen ohne Verpackung abstrakte Rückgabetypen, die es erlauben würde, die Rückkehr Verschlüsse von Wert, ohne Boxen, aber dieser RFC wurde verschoben. Nach der Diskussion in diesem RFC, es scheint, daß einige arbeiten es vor kurzem, so dass es möglich ist, die ohne Verpackung abstrakte Typen zurückgegeben wird schon relativ bald erhältlich sein.
move
keyword? Machen nicht, dass die Schließung unabhängig von der stack-frame, und seine Größe zur Kompilierzeit bekannt?Box::new
Zeile, wo die Schließung zurückgegeben wird, wird der compiler plötzlich sagt:error: unable to infer enough type information about
_; type annotations or generic parameter binding required [E0282]
- Welchen Unterschied macht das Semikolon machen?Den
||
syntax ist immer noch der alte boxed-Verschlüsse, so dass diese nicht für den gleichen Grund, warum es zuvor nicht.Und es wird nicht funktionieren, selbst mit den richtigen boxed Schließung syntax
|&:| -> int
, denn es ist wörtlich nur Zucker für bestimmte Merkmale. Im moment, den Zucker syntax ist|X: args...| -> ret
, wo dieX
werden kann&
,&mut
oder nichts, entsprechend derFn
,FnMut
,FnOnce
Merkmale, kann man auch schreibenFn<(args...), ret>
etc. für die nicht-gezuckerten form. Der Zucker ist wahrscheinlich sich zu ändern (vielleicht so etwas wieFn(args...) -> ret
).Jeweils ohne Verpackung-Verschluss hat ein einzigartiges, namenlosen Typ intern erzeugt der compiler: der einzige Weg, zu reden, ohne Verpackung Verschlüsse ist über Generika und trait-Grenzen. Insbesondere schreiben
ist wie das schreiben
also sagen, dass
make_adder
gibt eine ohne Verpackung Merkmal Wert; das macht nicht viel Sinn im moment. Das erste, was zu versuchen wäreaber dies ist zu sagen, dass
make_adder
ist die Rückgabe einesF
dass die Anrufer wählt, während wir möchten sagen, es gibt einige Feste (aber "versteckt") geben. Dies erforderte abstract Rückgabetypen, die sagt, im Grunde, "der Rückgabewert implementiert diese Eigenschaft", während man noch ohne Verpackung und statisch aufgelöst. In der Sprache, die (vorübergehend geschlossen) RFC,Oder mit der Schließung Zucker.
(Ein weiterer kleiner Punkt: ich bin mir nicht 100% sicher ohne Verpackung Verschlüsse, aber die alten Verschlüsse sicher noch erfassen die Dinge, indem Sie-der Verweis ist eine andere Sache, der senken Sie den code wie vorgeschlagen, das Problem. Dies wird behoben #16610.)