我想重用我制作的迭代器,以避免花钱从头开始重新创建它.但是迭代器似乎不支持clonecollect移动了迭代器,所以我不能重用它.

这里大致相当于我正在try 做的事情.

let my_iter = my_string.unwrap_or("A").chars().flat_map(|c|c.to_uppercase()).map(|c| Tag::from(c).unwrap() );
let my_struct = {
  one: my_iter.collect(),
  two: my_iter.map(|c|{(c,Vec::new())}).collect(),
  three: my_iter.filter_map(|c|if c.predicate(){Some(c)}else{None}).collect(),
  four: my_iter.map(|c|{(c,1.0/my_float)}).collect(),
  five: my_iter.map(|c|(c,arg_time.unwrap_or(time::now()))).collect(),
  //etc...
}

推荐答案

如果迭代器的所有"片段"都是Clone-able的,那么迭代器通常是Clone-able的.my_iter中有几个不是:匿名闭包(比如flat_map中的闭包)和to_uppercase返回的ToUppercase struct .

你能做的是:

  1. 重建整个过程(正如@ArtemGr所建议的).可以使用宏来避免重复.有点难看,但应该管用.
  2. 在填充my_struct之前将my_iter收集到Vec中(因为你似乎在那里收集了它):let my_iter: Vec<char> = my_string.unwrap_or("A").chars().flat_map(|c|c.to_uppercase()).map(|c| Tag::from(c).unwrap() ).collect();
  3. 创建自己的自定义迭代器.如果没有你对my_stringTag的定义(因为你对它的定义是unwrap_or,我想它不是String)很难更具体地帮助你.

Rust相关问答推荐

阻止websocket中断的中断中断的终端(操作系统错误4)

为什么我的梅森素数代码的指数越大,速度就越快?

有没有办法模仿对象安全克隆?

如何使用 list 在Rust for Windows中编译?

从Type::new()调用函数

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

为什么`tokio::main`可以直接使用而不需要任何导入?

如何重命名 clap_derive 中的子命令占位符?

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

有没有办法通过命令获取 Rust crate 的可安装版本列表?

从 Axum IntoResponse 获取请求标头

在 Rust 中,为什么整数溢出有时会导致编译错误或运行时错误?

无法把握借来的价值不够长寿,请解释

只有一个字符被读入作为词法分析器的输入

`use std::error::Error` 声明中断编译

通用类型,不同于输入类型,作为函数的返回值

为什么我可以在没有生命周期问题的情况下内联调用 iter 和 collect?

如何用另一个变量向量置换 rust simd 向量?

Rust 生命周期:不能在方法内重新borrow 可变字段

为什么 `ref` 会导致此示例*取消引用*一个字段?