С Haxe очень легко определить пользовательские итераторы и итерируемые типы данных. Эти понятия представлены типами Iterator и Iterable <T> соответственно:
1 2 3 4 5 6 7 8 |
typedef Iterator<T> = { function hasNext() : Bool; function next() : T; } typedef Iterable<T> = { function iterator() : Iterator<T>; } |
Любой класс, который структурно согласуется с одним из этих типов, может быть проитерирован с помощью цикла for-loop. То есть, если класс определяет методы hasNext и next с соответствующими возвращаемыми типами, он считается итератором, а если он определяет итератор метода, возвращающий Iterator <T>, он считается итерируемым типом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
class BoundsArrayIterator<T> { var min:Int; var max:Int; var a:Array<T>; public function new(a:Array<T>, min:Int, max:Int) { this.a = a; this.min = min; this.max = max; } public function hasNext(){ return max > min; } public function next(){ return a[min++]; } } class BoundsArrayWrap<T> { var min:Int; var max:Int; var a:Array<T>; public function new(a:Array<T>, min:Int, max:Int) { this.a = a; this.min = min; this.max = max; } public function iterator(){ return new BoundsArrayIterator<T>(a, min, max); } } class Test { static function main() { var a = ['not', 'very', 'important', 'text', 'at', 'all']; var bounded = new BoundsArrayWrap<String>(a, 1, 4); for (str in bounded) { trace(str); } } } |
Выполнение кода можно посмотреть здесь
Тип BoundsArrayIterator<T> в данном примере является итератором. Он реализует методы hasNext, проверяющий достигнут ли конец диапазона, и next, возвращающий объект из массива. Данный итератор используется в классе BoundsArrayWrap<T> в методе iterator, который и определяет данный класс как итерируемый.
Было бы удобно, если бы была ссылка на http://try.haxe.org/ , где можно посмотреть на работу данного кода.
После долгого и тяжелого копирования, я запустил код, и он мне ничего не вывел, хотя предполагалось, что он выведет [‘very’, ‘important’, ‘text’] или [‘very’, ‘important’], тут как вам больше нравится. Тут я тестировал http://try.haxe.org/#f1105 .
Мне кажется, что было бы приятнее читать код, если бы между названием переменной и её типом были пробелы, что-то вроде этого «var a : Array», но это лишь моё мнение.
Добавлю ещё от себя «пожеланий»:
— Нет ссылки на статью, которая послужила источником информации.
— Если термины или фрагменты кода (например, переменные или типы данных) встречаются в тексте, то их лучше тоже оформлять при помощи crayon. Тогда они будут выглядеть также как в коде. Для примера я пределал одно из таких мест — Iterator<T>.
— Вы выбросили из текста все гиперссылки. Верните их, пожалуйста.
— Мне кажется, что «structurally unifies» лучше перевести как «структурно согласуется». А еще лучше посмотреть какой-нибудь учебник программирования, чтобы отыскать схожий термин.
Исправлено
Даша, смотрите внимательно перед тем как ждать моих замечаний. Уже во второй строке мусор. Дальше не смотрел. Надеюсь, вы посмотрите весь текст.