我正在尝试在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
看起来F
受Clone
特征和FnMut
特征的约束,但某些事情无法同时实现FnMut
和{{1} }}
在文档中存在一个无法调用的方法似乎很奇怪,所以我必须遗漏一些东西。
有人可以为我澄清一下吗?
MVCE:
Clone
答案 0 :(得分:8)
某种类型无法同时实现FnMut
和Clone
,但没有固有的理由,但似乎目前关闭并未实现{{1 }}。这是一个简短的discussion about this from 2015。我还没有找到最近的讨论。
我能够构建这个示例,其中通过在我自己的struct上实现Clone
来克隆FlatMap
,这需要不稳定的功能,所以每晚编译器(playground):
FnMut
答案 1 :(得分:4)
您在迭代器中创建项目集的笛卡尔积与另一个项的笛卡尔积。您可以使用.cartesian_product()
adaptor包中的itertools。