Sto provando a creare una matrice bidimensionale da un funtore che crea ciascun elemento e lo memorizza come un Vec piatto (ogni riga concatenata).Come utilizzare le chiusure nella mappa nidificata?
Ho usato la mappa nidificata (in realtà una mappa piatta e una mappa nidificata) per creare ogni riga e concatenarla. Here is what I tried:
fn make<T,F>(n: usize, m: usize, f: F) -> Vec<T>
where F: Fn(usize,usize) -> T
{
(0..m).flat_map(|y| (0..n).map(|x| f(x,y))).collect()
}
fn main() {
let v = make(5,5, |x,y| x+y);
println!("{:?}", v);
}
Purtroppo, ottengo un errore durante la compilazione (il solito 'non vive abbastanza a lungo'). Come si usano le chiusure nelle mappe nidificate?
<anon>:4:36: 4:46 error: `y` does not live long enough
<anon>:4 (0..m).flat_map(|y| (0..n).map(|x| f(x,y))).collect()
^~~~~~~~~~
<anon>:4:5: 4:58 note: reference must be valid for the method call at 4:4...
<anon>:4 (0..m).flat_map(|y| (0..n).map(|x| f(x,y))).collect()
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<anon>:4:25: 4:47 note: ...but borrowed value is only valid for the scope of parameters for function at 4:24
<anon>:4 (0..m).flat_map(|y| (0..n).map(|x| f(x,y))).collect()
^~~~~~~~~~~~~~~~~~~~~~
(ho lavorato a questo problema by using a single map on 0..n*m, ma io sono ancora interessato alla risposta.)
Forse un duplicato di http://stackoverflow.com/q/28521637/155423? – Shepmaster
Speravo da quando: usize era Copy-able, poteva essere preso in considerazione dalla chiusura interna, evitando così la necessità di qualsiasi prestito ... – Gyscos
Sono d'accordo, e sono un po 'sorpreso che c'è un errore qui a tutto - ho la sensazione che abbia a che fare con quel 'FnMut'. Potrebbe anche esserci un vero bug, dato che spruzzare '.clone()' su tutte le variabili non risolve il problema come pensavo sarebbe stato. – Shepmaster