Wie lege ich eine Lebensdauer für eine Optionserklärung fest?

8

Ich versuche ein Feld auf eine Struktur zu setzen, die ein Option<closure> enthalten soll.

Allerdings schreit Rust mich an, dass ich die Lebensdauer angeben muss (nicht, dass ich das wirklich schon gegrinst hätte). Ich versuche mein Bestes, aber Rust ist nie glücklich mit dem, was mir einfällt. Werfen Sie einen Blick auf meine Inline-Kommentare für die Kompilierfehler, die ich bekommen habe.

%Vor%     
Christoph 25.05.2014, 20:53
quelle

2 Antworten

15

Das wird ein bisschen komplizierter.

Als allgemeine Faustregel gilt: Wenn Sie eine geliehene Referenz (d. h. & type) in einer Datenstruktur speichern, müssen Sie ihre Lebensdauer benennen. In diesem Fall waren Sie auf dem richtigen Weg, indem Sie 'a verwenden, aber dass 'a in den aktuellen Bereich eingefügt werden muss. Dies geschieht auf die gleiche Art und Weise wie Sie Typvariablen einführen. So definieren Sie Ihre Floor struct:

%Vor%

Aber es gibt ein anderes Problem hier. Die Schließung selbst ist auch eine Referenz mit einer Lebensdauer, die auch benannt werden muss. Es gibt also zwei verschiedene Lebenszeiten hier! Versuchen Sie Folgendes:

%Vor%

Für Ihre impl Floor müssen Sie auch diese Lebenszeiten in den Gültigkeitsbereich einführen:

%Vor%

Sie könnten dies technisch auf eine Lebensdauer reduzieren und ||:'a -> &'a str verwenden, aber das bedeutet, dass die zurückgegebene &str immer dieselbe Lebensdauer hat wie die Schließung selbst, was ich für eine schlechte Annahme halte.

>     
BurntSushi5 25.05.2014, 21:28
quelle
2

Antwort für die aktuelle Rost-Version 1.x :

Es gibt zwei Möglichkeiten, um zu bekommen, was Sie wollen: Entweder ein ungeschachteltes oder ein geschlossenes. Unboxed Closures sind unglaublich schnell (die meiste Zeit sind sie inline), aber sie fügen der Struktur einen Typparameter hinzu. Boxed Closures fügen hier ein bisschen Freiheit hinzu: Ihr Typ wird durch eine Indirektionsebene gelöscht, die leider etwas langsamer ist.

Mein Code hat einige Beispielfunktionen und aus diesem Grund ist es ein bisschen länger, bitte entschuldigen Sie das;)

Unboxed Closure

Vollständiger Code:

%Vor%

Nun hat dies einige typische Probleme: Sie können nicht einfach eine Vec von mehreren Floor s haben und jede Funktion, die ein Floor Objekt verwendet, muss einen eigenen Typparameter haben. Außerdem: Wenn Sie die Zeile b.set_handler(|| "cheesecake"); entfernen, wird der Code nicht kompiliert, da dem Compiler die Typinformationen für b fehlen.

In einigen Fällen werden Sie nicht auf diese Probleme stoßen - in anderen benötigen Sie eine andere Lösung.

Schachtelverschlüsse

Vollständiger Code:

%Vor%

Es ist ein bisschen langsamer, weil wir eine Heap-Zuweisung für jede Schließung haben und wenn eine geschlossene Box aufgerufen wird, ist es meistens ein indirekter Aufruf (CPUs mögen keine indirekten Aufrufe ...).

Aber die Floor Struktur hat keinen Typparameter, so dass Sie Vec davon haben können. Sie können b.set_handler(Box::new(|| "cheesecake")); auch entfernen und es funktioniert weiterhin.

    
Lukas Kalbertodt 27.10.2015 13:58
quelle

Tags und Links