使用我的问题的以下简化/抽象版本:
fn main() {
let foo_selectors = vec![0, 1];
let foos: Vec<_> = foo_selectors
.into_iter()
.flat_map(|i| get_foo(i).into_iter())
.collect();
println!("{:?}", foos);
}
fn get_foo(i: u8) -> [u8; 3] {
if i % 2 == 0 {
[1, 2, 3]
} else {
[4, 5, 6]
}
}
我收到以下错误消息:
error[E0597]: borrowed value does not live long enough
--> src/main.rs:6:44
|
6 | .flat_map(|i| get_foo(i).into_iter())
| ---------- ^ temporary value dropped here while still borrowed
| |
| temporary value created here
...
10 | }
| - temporary value needs to live until here
错误消息抱怨借用,但我在任何地方都使用into_iter
,据我所知,它取得了迭代值的所有权。我想获取get_foo
返回的值的所有权,并将其元素插入foos
。我怎么能这样做?
答案 0 :(得分:4)
如何取得flat_map中值的所有权
这里from django.views.generic.edit import FormView
class MyFormView(FormView):
def get_initial(self):
initial = super(MyFormView, self).get_initial()
# update initial field defaults with custom set default values:
initial.update({'charfield1': 'foo', 'charfield2': 'bar'})
return initial
没有什么特别之处。调用flat_map
时,返回值的所有权将转移给调用者,就像Rust中的其他任何地方一样。
我到处都使用过to_iter,据我所知,它取得了迭代值的所有权。
通常,是的,但不适用于数组。请参阅下面的链接问题了解原因。这是问题的根源。 get_foo
封闭拥有flat_map
的结果,然后您引用它。引用不能超越封闭,但这就是你要求它做的。
作为解决方法,您可以从函数返回get_foo
:
Vec
您还可以将返回的数组转换为fn get_foo(i: u8) -> Vec<u8> {
if i % 2 == 0 {
vec![1, 2, 3]
} else {
vec![4, 5, 6]
}
}
来电中的Vec
。
如果您认为情况需要,您可以实现自己的迭代器:
flat_map
并将其用作struct CloneArrayIter<T> {
arr: [T; 3],
idx: usize,
}
impl<T> CloneArrayIter<T> {
fn new(arr: [T; 3]) -> Self {
Self { arr, idx: 0 }
}
}
impl<T> Iterator for CloneArrayIter<T>
where
T: Clone,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
if self.idx < 3 {
let value = self.arr[self.idx].clone();
self.idx += 1;
Some(value)
} else {
None
}
}
}
我可能只使用来自arrayvec的.flat_map(|i| CloneArrayIter::new(get_foo(i)))
:
ArrayVec
另见: