Wie können Schließungen in verschachtelten Karten verwendet werden?

8

Ich versuche eine 2-dimensionale Matrix aus einem Funktor zu erstellen, der jedes Element erzeugt und speichert es als eine flache Vec (jede Reihe verkettet).

Ich habe eine verschachtelte Map (eigentlich eine flat_map und eine verschachtelte Map) verwendet, um jede Zeile zu erstellen und sie zu verketten. Folgendes habe ich versucht :

%Vor%

Leider bekomme ich beim Kompilieren einen Fehler (das übliche "lebt nicht lange genug"). Wie benutzt man Closures in verschachtelten Maps?

%Vor%

(Ich habe dieses Problem gelöst, indem ich eine einzige Karte für 0..n * m , aber ich bin immer noch an der Antwort interessiert.)

    
Gyscos 04.06.2015, 23:12
quelle

1 Antwort

7

In Ihrem Fall ist der innere Abschluss |x| f(x,y) ein Borrowing Closure, der seine Umgebung ( y und f ) als Referenz verwendet.

Die Funktionsweise von .flat_map(..) verbietet es Ihnen, einen Verweis auf y zu behalten, der nicht aus dem äußeren Bereich stammt. Daher muss Ihre Schließung ihre Umgebung nach Wert annehmen, was kein Problem für y ist, das usize ist, was Copy :

ist %Vor%

Aber jetzt tritt ein anderes Problem auf:

%Vor%

Hier ist rustc nicht glücklich: wir versuchen, auch f in die Schließung zu verschieben, was definitiv nicht möglich ist (es sei denn, m ist 1 , aber der Compiler kann es nicht wissen).

Aber f ist ein Fn(usize,usize) -> T , was bedeutet, dass wir auch explizit eine & Referenz darauf übergeben können, und & Referenzen sind Copy :

%Vor%

In diesem Fall nimmt der Abschluss seine Umgebung nach Wert, und diese Umgebung besteht aus y und f_ref , wobei beide Copy sind, alles ist gut.

    
Levans 05.06.2015, 06:01
quelle

Tags und Links