gpt4 book ai didi

closures - 为什么嵌套迭代器闭包不会从外部范围复制值

转载 作者:行者123 更新时间:2023-11-29 08:33:11 26 4
gpt4 key购买 nike

我正在尝试使用嵌套迭代器,其中内部迭代器使用来自外部迭代器的值。

vec![0;10].iter().flat_map(|&a| {
(0..10).map(|b|{
a + b
})
});

error: a does not live long enough

    (0..10).map(|b|{
^^^

note: reference must be valid for the method call...

如果我移动内部闭包(move |b|{),这会编译,但我不明白为什么它是必要的,因为 a 是一个整数并且可以复制而不是移动。

最佳答案

flat_mapmap 都是惰性的。内部 map 不会立即使用 a 而是尝试“保存”它以备后用,因此借用了 a。但是由于 a 是外部闭包的本地对象,并且您返回 map 的结果,因此借用将变得无效。您需要使用内部迭代器:

vec![0;10].iter().flat_map(|&a| {
(0..10).map(|b|{
a + b
}).collect::<Vec<_>>()
});

当然这样效率不高,内部闭包“保持”a 会好得多。您可以通过将内部闭包标记为 move 来完成此操作:

vec![0;10].iter().flat_map(|&a| {
(0..10).map(move |b|{
a + b
})
});

通常情况下,编译器不会让你这样做,因为 flat_map 闭包不拥有 a,它只有一个对它的引用。然而,由于 Rust 中的数字类型(如 isize)实现了 Copy 特性,编译器将复制 a 而不是尝试移动它,给出你想要的行为。请注意,这也是允许在 flat_map 中取消引用 a(使用 |&a|)的原因;通常这需要拥有 a,而不仅仅是对它的引用(这是 .iter() 产生的结果)。

关于closures - 为什么嵌套迭代器闭包不会从外部范围复制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44146040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com