rust - 可克隆迭代器特征对象

标签 rust

我正在尝试定义一个带有可克隆迭代器对象的结构。到目前为止,我已经达到:

pub struct UseClonableIterator2<'a,T:'a> {
    it: &'a (Iterator<Item=T> + Clone)
}

无法编译,因为 Clone 不是“内置特征”:

x.rs:2:33: 2:38 error: only the builtin traits can be used as closure or object bounds [E0225]
x.rs:2     it: &'a (Iterator<Item=T> + Clone)
                                       ^~~~~           
x.rs:2:33: 2:38 help: run `rustc --explain E0225` to see a detailed explanation

一个选项可能是为迭代器添加另一个类型参数,但这会使定义复杂化,我宁愿避免它。

最佳答案

你需要动态调度吗?如果不是,您应该使用通用参数而不是特征对象——它不一定会使定义复杂化。例如试试这个:

pub struct UseClonableIterator<I: Iterator + Clone> {
    it: I
}

在这里您保存在您的类型中实现IteratorClone 的对象。如果你只是想引用它,这当然也是可能的:

pub struct UseClonableIterator2<'a, I: Iterator + Clone + 'a> {
    it: &'a I
}

请注意,在这两个示例中,我们都使用了静态分派(dispatch)和单态化。这通常会带来更好的性能。

然而,这并不总是可能的——有时需要使用特征对象进行动态分派(dispatch)(就像你试图实现它一样)。在那种情况下,您只能通过重构代码来解决问题,因为 Rust 还不允许具有多个特征的特征对象。

关于rust - 可克隆迭代器特征对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35378474/

相关文章:

regex - Rob Pikes 正则表达式的惯用 Rust 重写

multithreading - 如何跨线程共享盒装特征类型的堆分配向量

rust - 取 n 次根

rust - 不每晚使用时如何忽略基准测试?

asynchronous - 在异步Rust中,如何实现围绕民意调查的包装?

arrays - 如何将sha256的前128位作为u128,而没有结果?

http - 如何从 Rust 发出 HTTP 请求?

enums - 我最接近通过 char 区分枚举的是什么?

rust - 如何将映射函数中的变量绑定(bind)到类型?

macros - 当内部宏接受参数时,如何定义一个定义另一个宏的宏?