![]() |
множественный перебор
Всем привет.
Вот интересно, как обычно справляются с большим кол-ом циклов на однотипных условиях. Приведу пример о чем я. Имеется вектор CustomSprite . Стоит задача - проверить, изменил ли координату хоть один из набора - и сделать что - то Код AS3:
Код AS3:
Какним нибудь Код AS3:
|
Как вариант можно подписать каждый объект на событие Event.CHANGE (Или на какое-нибудь свое MyLittleSprite.CHANGED_COORDINATES) и сделать обработчик события в одном месте, например в объекте-родителе ваших спрайтов. При изменении координат любого объекта производить диспетчиризацию события Event.CHANGE, на которое вы собственно и подписали объект, и обрабатывать это событие во внешнем обработчике. Тогда не будет никаких циклов.
На несколько задач вопрос решается аналогично - в зависимости от изменения диспетчиризуем одно, второе или третье событие. Или одно и то же событие, но с разными параметрами Вариант с одним событием: Код AS3:
Код AS3:
|
KumoKairo - вообще меня не понял. События тут вообще не причем. Это я просто предоставил пример насчет координат, тут совсем разговор о другом.
Расширю пример : есть несколько стадий игры, начало, конец, в игре*. Некий объект меняет свои характеристики в течении цикла. И по окончанию игры нужно проводить действия. Все записало в модель, все держится, объектов куча поэтому проверяем в цикле. И вот к пример где мне пришлось делать 2 цикла с однотипными условиями так скажем : 1) Записали текущее состояние стола в модель 2) Проверяем в цикле - если хоть один объект *сделал что-то* - очищаем из модели тек. состояние 3) Проверяем в цикле - если хоть один объект *сделал что-то* - записываем то, что он сделал. P.s. модель общая Код AS3:
|
Можно использовать временные хранилища ( так же и для остальных примеров, создаем временные массивы после цикла переприсвоение)
Код AS3:
|
Цитата:
Кстати, почему сразу не писать: Код AS3:
Тут нет никакой избыточной информации, короче не напишешь, и функции высших порядков тут лучше не сделают (можно, конечно, слепить массив функций-итераторов и упомянуть v только один раз - но это абзац и код короче не делает), вы же кроме "пройтись по v" никакой логики не дублируете, или таки что-то есть ещё? В чём проблема то? |
expl
Ну да именно напрягает несколько однотипных циклов в одном методе. И да форыч логичнее, просто писал на скорую руку |
Да никак обычно в AS3 с этим не справляются. И проблема даже не столько в необходимости методов, сколько в очень длинном синтаксисе создания анонимных функций. Если бы не это, можно было бы писать в функциональном стиле:
Код AS3:
Если создадите свою функцию, станет легче, но не сильно. Да, прототипы функций будут короче, но само объявление функции - длинное. Под платформу flash мне нечего вам посоветовать. Есть haxe, но там лямбды (анонимные функции) тоже начинаются со слова function. А вот в функциональных языках все хорошо. Например, scala: Код:
v.fiter(x => x.x > 30).forEach(y => doSomething1()) |
forEach это уже по определению не _чисто_ функционально :) - без переменных ничего не сделаешь в отличие от функции reduce
|
| Часовой пояс GMT +4, время: 08:31. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.