使用 flat_map 将 Vec<u8> 转换为 Vec<char>
Use flat_map to convert Vec<u8> to Vec<char>
我遇到了与 类似的情况,但无法弄清楚我的情况有何不同:
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<_>>());});
您首先将闭包 |d| format!("{:04b}", d)
映射到您的迭代器上,生成 String
s,它拥有自己的数据,因此这可以完美地找到。下一步中的 flat_map()
在每个 String
上调用 .chars()
。这隐式地将 String
取消引用为 &str
,并创建引用此借用的 Chars
迭代器。但现在我们遇到了一个问题——没有人拥有我们借来的 String
。
一种解决方法是存储 String
s 的临时向量:
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
的所有者,一切又恢复正常了。
我遇到了与
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<_>>());});
您首先将闭包 |d| format!("{:04b}", d)
映射到您的迭代器上,生成 String
s,它拥有自己的数据,因此这可以完美地找到。下一步中的 flat_map()
在每个 String
上调用 .chars()
。这隐式地将 String
取消引用为 &str
,并创建引用此借用的 Chars
迭代器。但现在我们遇到了一个问题——没有人拥有我们借来的 String
。
一种解决方法是存储 String
s 的临时向量:
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
的所有者,一切又恢复正常了。