我想在枚举数组上调用 .map()
:
enum Foo {
Value(i32),
Nothing,
}
fn main() {
let bar = [1, 2, 3];
let foos = bar.iter().map(|x| Foo::Value(*x)).collect::<[Foo; 3]>();
}
但是编译器提示:
error[E0277]: the trait bound `[Foo; 3]: std::iter::FromIterator<Foo>` is not satisfied
--> src/main.rs:8:51
|
8 | let foos = bar.iter().map(|x| Foo::Value(*x)).collect::<[Foo; 3]>();
| ^^^^^^^ a collection of type `[Foo; 3]` cannot be built from an iterator over elements of type `Foo`
|
= help: the trait `std::iter::FromIterator<Foo>` is not implemented for `[Foo; 3]`
我该怎么做?
最佳答案
问题其实在collect
, 不在 map
.
为了能够将迭代的结果收集到一个容器中,这个容器应该实现FromIterator
.
[T; n]
不执行 FromIterator
因为它通常不能这样做:产生 [T; n]
你需要提供n
元素完全相同,但是在使用 FromIterator
时您无法保证将输入到您的类型中的元素数量。
还有一个困难,如果没有补充数据,你将不知道你现在应该输入数组的哪个索引(以及它是空的还是满的)等等......这可以通过使用 enumerate
来解决。在 map
之后(本质上是为索引提供数据),但是如果提供的元素不足或过多,您仍然会遇到决定要做什么的问题。
因此,不仅目前无法实现FromIterator
在固定大小的数组上;但即使在未来,这似乎也很渺茫。
那么,现在该怎么办?有几种可能性:
- 在调用点内联转换:
[Value(1), Value(2), Value(3)]
,可能在宏的帮助下 - 收集到不同的(可增长的)容器中,例如
Vec<Foo>
- ...
关于rust - 如何收集到数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757355/