Как перебрать итератор в штучной упаковке?

Примечание: этот вопрос устарел начиная с Rust 1.0. Iterator черта теперь имеет связанный тип, Item, вместо параметра типа и одеяла Iterator реализация была добавлена ​​для Box<Iterator>,

Я хочу определить метод черты, который возвращает итератор. Я хочу не указывать фактический тип возвращаемого значения, поэтому пока у нас нет распакованных абстрактных возвращаемых типов, я использую объекты-черты. Это означает, что метод возвращает 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>>, Или, в более общем смысле, как я могу использовать объекты в штучной упаковке?

1 ответ

Проблема в том, что Box<Iterator<A>> сам не реализует Iterator черта характера. (Я не уверен точно, почему, возможно, кто-то еще может вмешаться в этот вопрос.)

Вы можете исправить это самостоятельно с помощью:

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

Но так как ни тип, ни черта не определены в вашем ящике, это не разрешено. Чтобы обойти это, вы можете определить свою собственную особенность Iterator, воплощать в жизнь Iterator<A> для всех Box<MyIter<A>> а затем реализовать MyIter<A> для всех типов I которые удовлетворяют Iterator<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 так как это требуется для итераторов.)

Другие вопросы по тегам