Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как создавать функции в цикле (http://www.flasher.ru/forum/showthread.php?t=118377)

Smrad 21.11.2008 17:47

Как создавать функции в цикле
 
Такой код:
Код AS3:

var ar : Array = new Array();
 
for (var i : int = 0; i < 10; i++)
{
    var handler : Function =
    function() : void
    {
        trace(i);
    }
 
    ar.push(handler);       
}
 
for (var j : int = 0; j < 10; j++)
{
    ar[j]();
}

10 раз напечатает число 11. Как сделать, чтобы подобный код печатал числа от 0 до 9?
Заранее спасибо за ответы.

iNils 21.11.2008 18:02

Функции в цикле не создают.

Smrad 21.11.2008 18:14

Информативно. Спасибо за неоценимую помощь.

Добавлено через 4 минуты
В общем, решилось добавлением дополнительного параметра:
Код AS3:

var ar : Array = new Array();
for (var i : int = 0; i < 10; i++)
{
    var handler : Function =
    function(par:int) : Number
    {
        return i;
    }
    ar.push(handler(i));       
}


Xpb7 21.11.2008 18:20

Smrad, a чем ты не доволен? Тебе ответили на твой вопрос. Зачем тебе такой изврат?

Smrad 21.11.2008 18:28

То что кто-то не умеет использовать определенную технику, это не делает эту технику извратом.

У меня есть массив кнопок. Как в цикле повесить на них однотипные обработчики?

etc 21.11.2008 18:30

Dictionary вас спасёт.

Smrad 21.11.2008 18:32

Цитата:

Сообщение от __etc (Сообщение 778890)
Dictionary вас спасёт.

Если не трудно, объясните подробнее.

etc 21.11.2008 18:39

Повторяться не буду:

http://www.flasher.ru/forum/showthread.php?t=113736

Smrad 21.11.2008 18:44

Цитата:

Сообщение от __etc (Сообщение 778893)
Повторяться не буду:

http://www.flasher.ru/forum/showthread.php?t=113736

Спасибо, но, по моему, это очевидно. Т.е. решение в лоб.

Собственно вопрос был не о том, как решить конкретную проблему, а о том, как решить класс проблем.

Fernando Costa 21.11.2008 18:57

Цитата:

У меня есть массив кнопок.
создайте кнопке класс

Xpb7 21.11.2008 18:58

Цитата:

Сообщение от Smrad (Сообщение 778888)
То что кто-то не умеет использовать определенную технику, это не делает эту технику извратом.

У меня есть массив кнопок. Как в цикле повесить на них однотипные обработчики?

Так вы и не описали, зачем вам такая реализация. Правда, и в вашем случае это всё равно изврат, создавать функции в цикле.

Цитата:

Сообщение от __etc (Сообщение 778893)
Повторяться не буду:

http://www.flasher.ru/forum/showthread.php?t=113736

Отличная тема.

etc 21.11.2008 19:06

Smrad, какой класс проблем? Это универсальное решение для варианта «N данных для N кнопок».

Smrad 21.11.2008 19:18

Цитата:

Сообщение от Fernando Costa (Сообщение 778900)
создайте кнопке класс

Это все очевидно.
Я спрашивал о конкретном языковом механизме.

Добавлено через 4 минуты
Цитата:

Сообщение от __etc (Сообщение 778904)
Smrad, какой класс проблем? Это универсальное решение для варианта «N данных для N кнопок».

Проблема не в кнопках. А в создании функций в цикле.

etc 21.11.2008 19:25

Цитата:

Сообщение от Smrad (Сообщение 778910)
Проблема не в кнопках. А в создании функций в цикле.

Боже мой, зачем? Объясните, какая цель преследуется в создании кучи функций в цикле? Сколько я себя помню, ни разу у меня не возникала необходимость подобного.

iNils 21.11.2008 19:32

Цитата:

Сообщение от Smrad (Сообщение 778910)
А в создании функций в цикле.

Я вам еще раз повторяю - функции в цикле не создают. И не потому что я "не умею использовать определенную технику", а потому, что это не техника, а дилетантство.

Smrad 21.11.2008 21:09

Цитата:

Сообщение от __etc (Сообщение 778913)
Боже мой, зачем? Объясните, какая цель преследуется в создании кучи функций в цикле? Сколько я себя помню, ни разу у меня не возникала необходимость подобного.

Для того, чтобы не писать лишний код.

Добавлено через 6 минут
Цитата:

Сообщение от iNils (Сообщение 778915)
Я вам еще раз повторяю - функции в цикле не создают. И не потому что я "не умею использовать определенную технику", а потому, что это не техника, а дилетантство.

Так вы же не пробовали, откуда тогда знаете, что это дилетантство. Стало быть, всё функциональное программирование - дилетанство.

В общем какого-то изящного решения я не нашел, пришлось сделать в лоб.
Всем спасибо, тему можно закрыть.

iNils 21.11.2008 21:40

Цитата:

Сообщение от Smrad (Сообщение 778948)
Так вы же не пробовали, откуда тогда знаете, что это дилетантство.

Если сами не знаете, слушайте и учитесь у тех кто знает.
Код AS3:

var handler:Function = function(par:int) : Number {
        return par * par;
};
 
var ar : Array = new Array();
for (var i : int = 0; i < 10; i++) {
        var obj:Object = new Object ();
        obj.handler = handler;
        obj.i = i;
        ar.push (obj);
}
for (var j : int = 0; j < 10; j++) {
        trace (ar[j].handler (ar[j].i))
}

Отличии моего от вашего в том, что у меня одна копия на 10 объектов, а у вас 10 копий, по одной на каждый объект. А результат один и тот же.

etc 21.11.2008 22:33

Цитата:

Сообщение от Smrad (Сообщение 778948)
Для того, чтобы не писать лишний код.

Добиться небольшого количества кода можно и без засорения памяти одинаковыми неудаляемыми функциями.

kackbip 22.11.2008 13:54

Автору.
Вобщем-то все работает у вас правильно.
Вы написали в цикле trace(i); и у вас трейсится значение переиенной i. В чем проблема? :) Если вы хотите другого результата то поменяйте логику.

Smrad 29.11.2008 14:52

Чтобы не создавать лишнюю тему, отпишу здесь.

Описанный __ect способ работает не совсем корректно. Дело в том что таржет и "то на что вешали листенер" могут не совпадать. Это бывает если "то на что вешали листенер" имеет потомков (в смысле child'ов).

Замыканий в as3, как оказалось, нет. Жаль. Зато есть динамические поля, применяя которые, можно получить такой же эффект.

etc 29.11.2008 15:03

Цитата:

Сообщение от Smrad (Сообщение 780465)
Описанный __ect способ работает не совсем корректно. Дело в том что таржет и "то на что вешали листенер" могут не совпадать. Это бывает если "то на что вешали листенер" имеет потомков (в смысле child'ов).

Так используйте currentTarget, тогда. Или выключайте mouseChildren. Я привел лишь схему, готовый код и допиливание будет выполнять непосредственно автор вопроса.


Часовой пояс GMT +4, время: 06:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.