我陷入了与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<_>>());});发布于 2017-12-15 06:01:20
您首先将闭包|d| format!("{:04b}", d)映射到迭代器上,生成拥有其数据的Strings,因此这将完美地工作。下一步中的flat_map()在每个String上调用.chars()。这会隐式地将String释放到&str,并创建一个引用此借入的Chars迭代器。但现在我们有一个问题--没有人再拥有我们借来的String了。
一种解决方法是存储String的临时矢量:
let mut vec = vec![vec![0u8, 1u8], vec![2u8, 3u8], vec![4u8, 5u8]];
vec.iter().map(|row| {
let strings: Vec<_> = row
.iter()
.map(|d| format!("{:04b}", d))
.collect();
strings
.iter()
.flat_map(|s| s.chars())
.collect::<Vec<_>>()
});现在,我们有了中介String的所有者,一切都可以正常工作。
https://stackoverflow.com/questions/47822349
复制相似问题