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.)
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
:
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
:
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.