7

注意:这个问题自 Rust 1.0 以来已过时。Iteratortrait 现在有一个关联的类型,而Item不是类型参数,并且为 .Iterator添加了一个全面的实现Box<Iterator>

我想定义一个返回迭代器的特征方法。我想避免指定实际的返回类型是什么,所以在我们取消装箱的抽象返回类型之前,我使用的是 trait 对象。这意味着方法返回Box<Iterator<A>>。但我不确定如何使用盒装特征对象。我无法遍历类型的对象Box<Iterator<A>>

fn main() {
    let xs = vec![0u, 1, 2, 3];
    let boxed_iter = box xs.iter() as Box<Iterator<&uint>>;
    for x in boxed_iter {}
}

这与"for" loop expression does not implement the "Iterator" trait.

所以我的问题是:我如何迭代Box<Iterator<A>>. 或者,更一般地说,我如何使用盒装特征对象?

4

1 回答 1

5

问题是它Box<Iterator<A>>本身并没有实现这个Iterator特征。(我不确定为什么,也许其他人可以在这一点上插话。)

你可以自己解决这个问题:

impl<A> Iterator<A> for Box<Iterator<A>> {
    fn next(&mut self) -> Option<A> { self.next() }
}

但是由于您的 crate 中既没有定义类型也没有定义特征,因此这是不允许的。为了解决这个问题,你可以定义你自己的子特征IteratorIterator<A>为所有Box<MyIter<A>>实现,然后为所有满足MyIter<A>的类型实现:IIterator<A>

trait MyIter<A> : Iterator<A> {}
impl<A, I: Iterator<A>> MyIter<A> for I {}

// This is now allowed because `MyIter` is defined in this crate.
impl<A> Iterator<A> for Box<MyIter<A>> {
    fn next(&mut self) -> Option<A> { self.next() }
}

而且您必须更改代码才能使用as Box<MyIter<&uint>>

fn main() {
    let xs = vec![0u, 1, 2, 3];
    let mut boxed_iter = box xs.iter() as Box<MyIter<&uint>>;
    for x in boxed_iter { println!("{}", x); }
}

(我添加了可变性,boxed_iter因为它是迭代器所必需的。)

于 2014-08-21T22:28:27.163 回答