小编kir*_*lkh的帖子

连接字符串向量的向量

我正在尝试编写一个函数来接收字符串向量的向量,并返回连接在一起的所有向量,即它返回一个字符串向量.

到目前为止我能做的最好的事情如下:

fn concat_vecs(vecs: Vec<Vec<String>>) -> Vec<String> {
    let vals : Vec<&String> = vecs.iter().flat_map(|x| x.into_iter()).collect();
    vals.into_iter().map(|v: &String| v.to_owned()).collect()
}
Run Code Online (Sandbox Code Playgroud)

但是,我对这个结果不满意,因为看起来我应该能够Vec<String>从第一次collect调用中获得,但不知怎的,我无法弄清楚如何做到这一点.

我更感兴趣的是弄清楚为什么返回类型collect是正确的Vec<&String>.我试图从API文档和源代码中推断出这一点,但尽管我付出了最大的努力,我甚至无法理解函数的签名.

所以让我尝试跟踪每个表达式的类型:

- vecs.iter(): Iter<T=Vec<String>, Item=Vec<String>>
- vecs.iter().flat_map(): FlatMap<I=Iter<Vec<String>>, U=???, F=FnMut(Vec<String>) -> U, Item=U>
- vecs.iter().flat_map().collect(): (B=??? : FromIterator<U>)
- vals was declared as Vec<&String>, therefore 
      vals == vecs.iter().flat_map().collect(): (B=Vec<&String> : FromIterator<U>). Therefore U=&String.
Run Code Online (Sandbox Code Playgroud)

我假设上面的类型推断器能够U=&String根据类型来确定vals.但是如果我在代码中给表达式赋予显式类型,则编译时没有错误:

fn concat_vecs(vecs: Vec<Vec<String>>) -> Vec<String> {
    let a: Iter<Vec<String>> = vecs.iter(); …
Run Code Online (Sandbox Code Playgroud)

vector concatenation rust

4
推荐指数
1
解决办法
1557
查看次数

标签 统计

concatenation ×1

rust ×1

vector ×1