2016-02-13 67 views
2

我想用可克隆迭代器对象定义一个结构。到目前为止,我已经达到了:Clonable迭代器特质对象

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 

一种选择可能是添加另一种类型参数的迭代器,但这使定义变得复杂,我宁愿避免它。

回答

3

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

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

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

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

注意,在这两个例子中,我们使用静态调度和monomorphization。这通常会导致更好的性能。

但是,这并不总是可行的 - 有时需要使用特质对象(如您试图实现它)的动态分派。在这种情况下,你只能通过重构你的代码来解决你的问题,因为Rust不允许多特性的特征对象。