首页 > 解决方案 > 如何在 Rust 中将 std::iter::Iterator::map 用于树状结构?

问题描述

据我了解,将函数应用于 Rust 结构的每个元素的惯用方法是实现IntoIteratorandFromIterator并使用mapand 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

解决方案


在 Rust 中将函数应用于结构的每个元素的惯用方式是实现IntoIteratorFromIterator

这并不完全正确。惯用的方法是提供一个迭代器,但您不必实现这些特征。

举个例子&str:没有一个规范的方法来迭代一个字符串。您可以迭代它的字节或字符,因此它没有实现IntoIterator但有两个方法byteschars返回不同类型的迭代器。

树也是类似的:没有一种方法可以迭代树,所以它可以有一个depth_first_search返回迭代器的方法DepthFirstSearch和一个breadth_first_search返回BreadthFirstSearch迭代器的方法。

类似地, aString可以由&stror 的迭代器构造,char因此String实现了FromIterator<&str>and FromIterator<char>,但它没有实现FromIterator<u8>,因为随机字节不太可能形成有效的 UTF-8 字符串。

也就是说,集合与其迭代器之间并不总是存在一对一的关系。


并使用 […]collect

这是(大部分)不正确的。收集不是使用迭代器的好方法,除非您以后真的想使用收集的结果。如果你只想执行一个迭代器的效果,使用for方法for_each


推荐阅读