我试图装饰一个现有的迭代器:
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(出于兼容性原因,不是其他类型)。
Iter
aurhwmvo1#
在Rust中,迭代器通过Iterator trait提供一个公共接口来工作,每个具体的迭代器都有自己的类型。例如,迭代器的.map(...)方法将返回Map。特别是,这意味着你不能返回Iter<String>,因为这不是.map(...)返回的。通常,人们不关心迭代器的实际类型,所以类型擦除是可以的:
Iterator
.map(...)
Map
Iter<String>
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>。
1条答案
按热度按时间aurhwmvo1#
在Rust中,迭代器通过
Iterator
trait提供一个公共接口来工作,每个具体的迭代器都有自己的类型。例如,迭代器的.map(...)
方法将返回Map
。特别是,这意味着你不能返回Iter<String>
,因为这不是.map(...)
返回的。通常,人们不关心迭代器的实际类型,所以类型擦除是可以的:这是更通用的(因为它将接受任何迭代器,而不仅仅是切片上的迭代器),并且您不必费心拼写迭代器的确切类型,这可能非常冗长。您可能还希望对代码的其余部分应用类似的转换,以便不再需要返回
Iter<String>
。