我正在尝试使用嵌套迭代器,其中内部迭代器使用外部迭代器的值。
vec![0;10].iter().flat_map(|&a| {
(0..10).map(|b|{
a + b
})
});
error: a
活得不够长
(0..10).map(|b|{
^^^
注意:引用必须对方法调用有效...
如果我移动内部闭包(move |b|{
),但鉴于此,我不明白为什么有必要a
是一个整数,可以被复制而不是移动。
Both flat_map
and map
很懒。内部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
而不是试图移动它,而是给出你想要的行为。请注意,这也是允许您取消引用的原因a
(using |&a|
) 在里面flat_map
;通常这需要拥有a
,而不仅仅是对它的引用(这就是.iter()
产量)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)