Как перебрать итератор в штучной упаковке?
Примечание: этот вопрос устарел начиная с 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
так как это требуется для итераторов.)