gpt4 book ai didi

rust - 如何在 .unzip() 返回的每个迭代器上使用 .collect()?

转载 作者:行者123 更新时间:2023-11-29 07:54:39 24 4
gpt4 key购买 nike

我有以下代码,其中 fac 返回 (MyType, OtherType):

let l = (-1..13).map(|x| {
fac(x).0
}).collect::<Vec<MyType>>();

它有效,但我丢弃了 OtherType 值。所以我决定使用 .unzip,像这样:

let (v, r) = (-1..13).map(|x| {
fac(x)
}).unzip();
let l = v.collect::<Vec<MyType>>();
let q = r.collect::<Vec<OtherType>>();

但是类型推断失败了:

error: the type of this value must be known in this context
let l = v.collect::<Vec<Literal>>();
^~~~~~~~~~~~~~~~~~~~~~~~~~~
let q = r.collect::<Vec<OtherType>>();
^~~~~~~~~~~~~~~~~~~~~~~~~~~

问题是:我不知道也不关心迭代器的具体类型是什么(我想编译器可以推断出它们,如第一个片段所示)。这种情况下如何满足编译器?

此外,我更愿意重组代码 - 我不喜欢在 vr 上分别调用 .collect() >。理想情况下,我会在 .unzip() 之后继续方法链,在该表达式中返回两个 Vec

最佳答案

.unzip()不返回迭代器——它就像两个并行的收集器!实际上,您可以将这两部分收集到不同类型的集合中,但在本例中我们对两者都使用向量:

// Give a type hint to determine the collection type
let (v, r): (Vec<MyType>, Vec<OtherType>) = (-1..13).map(|x| {
fac(x)
}).unzip();

这样做是为了尽可能简单和透明。相反,返回两个迭代器需要它们共享一个公共(public)状态,而 Rust 的迭代器库希望避免这种复杂性。

关于rust - 如何在 .unzip() 返回的每个迭代器上使用 .collect()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31224957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com