rust - 如何收集到数组中?

标签 rust

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

相关文章:

multithreading - 在线程之间发送数据的惯用方法是什么?

arrays - 尝试 const 数组中的 .find() 值时如何修复 "temporary value dropped here while still borrowed"?

rust - 如何将向量解析为函数?

rust - 当只需要部分结构时,如何避免克隆整个大型结构以发送给线程?

ios - 如何为 iOS 创建 Rust 动态库 (dylib)?

lambda - 在结构中存储 lambda 返回迭代器

postgresql - 动态参数数组

rust - 返回原始指针指向的数据引用

rust - 对如何使用 rust 模块感到困惑

rust - 如何在 Substrate 链中存储哈希?