代码之家  ›  专栏  ›  技术社区  ›  yegor256

如何从地图上绘制Iter?

  •  -1
  • yegor256  · 技术社区  · 3 年前

    我正在尝试装饰现有的迭代器:

    use std::slice::Iter;
    
    fn only_friend_names(i: Iter<Person>) -> Iter<String> {
      i.filter(|p| p.is_my_friend()).map(|p| p.name())
    }
    

    它不会编译。最后我错过了什么?

    顺便说一句,我不想将数据收集到向量中(出于性能原因),我确实想返回 Iter (出于兼容性原因,不是另一种类型)。

    1 回复  |  直到 3 年前
        1
  •  3
  •   jthulhu    3 年前

    在Rust中,迭代器通过 Iterator trait,每个具体迭代器都有自己的类型。例如 .map(...) 迭代器的方法将返回 Map 。特别是,这意味着 不能 回来 Iter<String> ,因为那不是什么 .map(…) 返回。通常,人们不关心迭代器的实际类型,所以类型擦除是可以的:

    fn only_friend_names(i: impl Iterator<Item=Person>) -> impl Iterator<Item=String> {
      i.filter(|p| p.is_my_friend()).map(|p| p.name())
    }
    

    这是更通用的(因为它将接受任何迭代器,而不仅仅是片上的迭代器),而且您不必麻烦拼写迭代器的确切类型,这可能非常冗长。您可能还想将类似的转换应用于代码的其余部分,以便返回 Iter<字符串> 不再需要。

    推荐文章