gpt4 book ai didi

rust - 如何收集到数组中?

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

我想在枚举数组上调用 .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/

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