在我写这篇文章的时候,这个问题已经在评论中得到了简短的回答,但也许更详细的版本仍然有帮助!
我也不明白货物检查背后的含义。(好吧,这个特征并不存在。但为什么?)
std提供了经常使用的转换,但它并不能为您完成所有转换。
的呼叫
split_whitespace
返回一个
SplitWhitespace
实现的结构(在本文的其余部分中,我将简单地说“is”)
Iterator
.
的呼叫
map
返回一个
Map
结构,它是其给定函数的返回类型的迭代器,因此它是字符串切片上的迭代器。
因为
地图
是一个迭代器,它有一个
collect
方法正如您在文档中看到的,如果存在
B
实现
FromIterator<Self::Item>
这
B
是你的
Vec<Vec<&str>>
和
Self::Item
是的项目
地图
这个
SplitWhiteSpace
结构。所以
收集
是在问,“是吗
Vec<Vec<&str>>
使生效
FromIterator<SplitWhiteSpace>
?, 如果是,我存在,如果不是,我拒绝存在”。
(
FromIterator<拆分空白>
并不意味着
Vec<T>
可以由
拆分空白
结构,但它可以由某种类型构成
I
它是(或可以成为)项的迭代器
拆分空白
.)
所以,让我们看看Vec文档,看看是否
Vec<Vec<&str>>
机具
FromIterator<拆分空白>
.
Vec
does implement
FromIterator<T>
but only for
Vec<T>
,所以在您的情况下,它实现
FromIterator<Vec<&str>>
但collect要求它实现
FromIterator<拆分空白>
。事实并非如此,因此您的代码无法编译。
换句话说,当收集
Map<X>
变成
Vec<Y>
,X必须等于Y。
这就是为什么添加
collect()
内部
.map
作品因为这使它成为
Map<Vec<&str>>
这意味着类型匹配。
flatmap
也起作用,因为这会创建
FlatMap<&str>
其工作原理与
地图
并且可以收集到
Vec<&str>
. (
flat_map
不需要
收集
在其给定函数内部,因为它可以处理内部的迭代器)