std :: iter :: FlatMap.clone()可能吗?

时间:2016-09-03 06:06:24

标签: rust clone flatmap

我正在尝试在FlatMap中创建所有可能的项目对:

possible_children.clone().flat_map(|a| possible_children.clone().map(|b| (a,b)))

为了做到这一点,我试图克隆一个FlatMap,我在文档中看到FlatMap结构实现了clone方法。但似乎不可能创建满足特征界限的FlatMap

这是我得到的错误:

error: no method named `clone` found for type `std::iter::FlatMap<std::ops::Range<u16>, _, [closure@src/main.rs:30:47: 33:27]>` in the current scope
  --> src/main.rs:37:66
   |
37 |         possible_children.clone().flat_map(|a| possible_children.clone().map(|b| (a,b)))
   |                                                                  ^^^^^
   |
   = note: the method `clone` exists but the following trait bounds were not satisfied: `[closure@src/main.rs:30:47: 33:27] : std::clone::Clone`

查看我看到的文档:

impl<I, U, F> Clone for FlatMap<I, U, F>
    where F: Clone, I: Clone, U: Clone + IntoIterator, U::IntoIter: Clone

impl<I, U, F> Iterator for FlatMap<I, U, F>
    where F: FnMut(I::Item) -> U, I: Iterator, U: IntoIterator

看起来FClone特征和FnMut特征的约束,但某些事情无法同时实现FnMut和{{1} }}

在文档中存在一个无法调用的方法似乎很奇怪,所以我必须遗漏一些东西。

有人可以为我澄清一下吗?

MVCE:

Clone

2 个答案:

答案 0 :(得分:8)

某种类型无法同时实现FnMutClone,但没有固有的理由,但似乎目前关闭并未实现{{1 }}。这是一个简短的discussion about this from 2015。我还没有找到最近的讨论。

我能够构建这个示例,其中通过在我自己的struct上实现Clone来克隆FlatMap,这需要不稳定的功能,所以每晚编译器(playground):

FnMut

答案 1 :(得分:4)

您在迭代器中创建项目集的笛卡尔积与另一个项的笛卡尔积。您可以使用.cartesian_product() adaptor包中的itertools