【发布时间】:2017-12-14 21:30:21
【问题描述】:
我陷入与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 这是documentation 的确切方式。为什么它在那里工作而不在这里工作?
-
@Andrew 该示例使用静态字符串。在您的示例中,字符串是在迭代器中创建的,因此它们的寿命不够长。
-
请参阅How can I store a Chars iterator in the same struct as the String it is iterating on? 以获取
.chars()的版本,该版本将转移String的所有权并因此适用于这种情况。
标签: rust borrow-checker