rust - 如何在 Rust 中将 std::iter::Iterator::map 用于树状结构?
问题描述
据我了解,将函数应用于 Rust 结构的每个元素的惯用方法是实现IntoIterator
andFromIterator
并使用map
and collect
。像这样:
enum F<A> {
// fields omitted
}
impl<A> IntoIterator for F<A> {
// implementation omitted
}
impl<A> FromIterator<A> for F<A> {
// implementation omitted
}
fn mapF<A, B>(x : F<A>, f) -> F<B>
where f : Fn(A) -> B
{
x.into_iter().map(f).collect()
}
然而,似乎不可能实现FromIterator
一棵树,因为有多种方法可以将一系列值组织成一棵树。有没有办法解决这个问题?
解决方案
在 Rust 中将函数应用于结构的每个元素的惯用方式是实现
IntoIterator
和FromIterator
这并不完全正确。惯用的方法是提供一个迭代器,但您不必实现这些特征。
举个例子&str
:没有一个规范的方法来迭代一个字符串。您可以迭代它的字节或字符,因此它没有实现IntoIterator
但有两个方法bytes
并chars
返回不同类型的迭代器。
树也是类似的:没有一种方法可以迭代树,所以它可以有一个depth_first_search
返回迭代器的方法DepthFirstSearch
和一个breadth_first_search
返回BreadthFirstSearch
迭代器的方法。
类似地, aString
可以由&str
or 的迭代器构造,char
因此String
实现了FromIterator<&str>
and FromIterator<char>
,但它没有实现FromIterator<u8>
,因为随机字节不太可能形成有效的 UTF-8 字符串。
也就是说,集合与其迭代器之间并不总是存在一对一的关系。
并使用 […]
collect
这是(大部分)不正确的。收集不是使用迭代器的好方法,除非您以后真的想使用收集的结果。如果你只想执行一个迭代器的效果,使用for
方法for_each
。
推荐阅读
- r - 更改 bin 编号 `scale_*_binned()`
- java - 如何在没有 for 循环的情况下通过 2D 数组?
- php - 更新php中一行的值时,如何控制在mySQL中不重复数据
- python - 打印 src 属性返回 null,Python selenium
- javascript - 智能手机的输入按钮出现问题
- reactjs - 使用带有 create-react-app 的 hookrouter 无法更新导航更改的视图
- angular - 无法绑定到“ngForOf”,因为它不是“li”Angular 9 的已知属性
- karma-jasmine - 在 Angular9 单元测试中订阅激活的路由参数
- r - 您如何使用向量并对 R 中的数据帧中的行执行离散计算?
- sql - 返回 SQL Server 中所有符合 TRUE 条件的列