如何获取flat_map

时间:2017-08-27 12:04:27

标签: iterator rust

使用我的问题的以下简化/抽象版本:

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]
    }
}

Playground Link

我收到以下错误消息:

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。我怎么能这样做?

1 个答案:

答案 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

另见:

相关问题