gpt4 book ai didi

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

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

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

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);

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

最佳答案

Iterator是一个特质,因此Box<Iterator>是一个特征对象

Clone不能成为特征对象,因为它需要 Self 的知识, 所以我们按照 How to clone a struct storing a boxed trait object? 中的说明进行操作:

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();
}

另见:

关于iterator - 如何在 Rust 中返回盒装的可克隆迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49594732/

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