如何在Rust中返回盒装可克隆迭代器?

凝视

从表达式返回装箱的可克隆迭代器的正确方法是什么?例如:

fn example() -> Box<Iterator<Item = String> + Clone> {
    unimplemented!()
}

这给我一个错误,即只能以这种方式指定自动特征:

error[E0225]: only auto traits can be used as additional traits in a trait object
 --> src/main.rs:1:47
  |
1 | fn example() -> Box<Iterator<Item = String> + Clone> {
  |                                               ^^^^^ non-auto additional trait

这是我的真实代码:

let my_iterator = {
    if a {
        Box::new(/* ... */) as Box<Iterator<Item = String> + Clone>
    } else {
        Box::new(/* ... */) as Box<Iterator<Item = String> + Clone>
    }
};
let pb = ProgressBar::new(my_iterator.clone().count() as u64);

如果考虑其他建议,则这两个分支代表一个从文件加载的路径,另一个代表自动生成的路径,如果不需要它们,我宁愿不将其保留在内存中。

Shepmaster

Iterator特质,因此Box<Iterator>特质对象

Clone因为需要知识Self,所以不能被制成特征对象,因此我们按照如何克隆存储有盒装特征对象的结构中的说明进行操作

trait CloneIterator: Iterator {
    fn clone_box(&self) -> Box<CloneIterator<Item = Self::Item>>;
}

impl<T> CloneIterator for T
where
    T: 'static + Iterator + Clone,
{
    fn clone_box(&self) -> Box<CloneIterator<Item = Self::Item>> {
        Box::new(self.clone())
    }
}

fn example(switch: bool) -> Box<CloneIterator<Item = String>> {
    let i = vec!["a".into(), "b".into()].into_iter();
    if switch {
        Box::new(i)
    } else {
        Box::new(i.take(1))
    }
}

fn main() {
    let i = example(true);
    let i2 = i.clone_box();

    let j = example(false);
    let j2 = j.clone_box();
}

也可以看看:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Rust中返回链式迭代器

在Rust中,如何创建可变的迭代器?

克隆Java中的迭代器?

可迭代对象的迭代器应在Java中返回可迭代对象本身

如何返回盒装价值?

如何在Rust中将盒装数组转换为Vec

如何在Rust中的自定义单线程迭代器上并行化map(...)

如何在Rust中更改迭代器元素以反转子字符串

如何在Rust中创建盒装封闭向量?

如何在Rust中的锁定结构成员上返回迭代器?

可克隆的迭代器特征对象

如何在Rust中定义一个包含可迭代项的结构上的迭代器?

如何在Rust中延长迭代器适配器内部临时变量的寿命?

如何在Rust中将迭代器正确传递给函数

如何在Rust中克隆Rc的选项?

如何在Rust中迭代宏的参数?

在迭代器上创建方法,该方法在Rust中返回迭代器

如何返回盒装迭代器,该盒装迭代器返回f64的盒装迭代器?

如何在Rust中为引用创建一个“可迭代”特征?

如何在C ++中返回有效的迭代器?

如何在克隆键的 HashMap 的键上返回迭代器?

如何在 Rust 迭代 N 次后停止迭代器?

如何在 Rust 结构中保存迭代器

如何在不消耗迭代器 int rust 的情况下获取元素(在 rust 中重写 strtol 的问题)

在 Rust 中,如何返回反向迭代器?

如何使用迭代器在类中以可迭代的形式仅返回除以 3 的数字

如何在不可迭代的 Rust 元素中迭代?

如何在 Rust 中为第三方库实现迭代器

如何展平 Result<Vec<T>,E> 的迭代器以在 rust 中返回 Result<T,E> 的迭代器?