Otrzymuję błąd wewnątrz zagnieżdżonej lambda.Błąd sprawdzania przy wypożyczeniu ze zmienną, która nie żyje wystarczająco długo w zagnieżdżonej lambda
let rows = vec![
vec![3, 6, 2, 8, 9, 0],
vec![0, 0, 1, 4, 5, 1],
];
let pair_sums = rows.iter()
.flat_map(|row| {
(0..row.len() - 1).map(|i| row[i] + row[i + 1])
})
.collect::<Vec<_>>();
println!("{:?}", pair_sums);
error[E0597]: `row` does not live long enough
--> src/main.rs:9:40
|
9 | (0..row.len() - 1).map(|i| row[i] + row[i + 1])
| --- ^^^ does not live long enough
| |
| capture occurs here
10 | })
| - borrowed value only lives until here
11 | .collect::<Vec<_>>();
| - borrowed value needs to live until here
mogę rodzaju zobaczyć, dlaczego tak się dzieje, i mogę to naprawić przez gwintowania wartość row
dzięki wewnętrznemu lambda:
let pair_sums = rows.iter()
.flat_map(|row| {
(0..row.len() - 1).zip(vec![row; row.len()])
.map(|(i, row)| row[i] + row[i + 1])
})
.collect::<Vec<_>>();
To jest straszne i może” t być najlepszym rozwiązaniem. Jak mogę odwoływać się do zmiennych w zakresie nadrzędnym bez konieczności bezpośredniego przekazywania ich dalej?
Dzięki. Właśnie przeczytałem tę odpowiedź po kilku miesiącach. Częścią, która nie była oczywista, jest iterator leniwych map. Połączenie tego z funkcją przechwytywania przez odniesienie sprawia, że wszystko ma sens. –