rust 如何从Map生成Iter?

6g8kf2rb  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(146)

我试图装饰一个现有的迭代器:

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(出于兼容性原因,不是其他类型)。

aurhwmvo

aurhwmvo1#

在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<String>

相关问题