我陷入了与Borrow-check error with variable not living long enough in nested lambda类似的困境,但无法确定我的情况有何不同:
let mut vec = vec![vec![0u8, 1u8], vec![2u8, 3u8], vec![4u8, 5u8]];
vec.iter().map(|row| {
row.iter()
.map(|d| format!("{:04b}", d))
.flat_map(|s| s.chars())
.collect::<Vec<_>>()
});
导致错误的原因:
error[E0597]: `s` does not live long enough
--> src/main.rs:6:35
|
6 | .flat_map(|s| s.chars())
| - ^ `s` dropped here while still borrowed
| |
| borrow occurs here
7 | .collect::<Vec<_>>()
| - borrowed value needs to live until here
我通过创建一个新的
Vec
并进行附加来解决它,但我不清楚为什么第一种方法不起作用。let mut tmp = vec![];
vec.iter()
.map(|d| format!("{:04b}", d))
.for_each(|s| {tmp.append(&mut s.chars().collect::<Vec<_>>());});
chars()
时,您借用s
来创建一个包含对其引用的Char
结构体。当您退出闭包时,s被丢弃,因此Char
无效。 - Boiethios.chars()
,它将转移String
的所有权,并因此在这种情况下起作用。 - Shepmaster