Форум 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=194027)

Dip52 06.02.2013 18:31

Как вызвать функцию функции класса?
 
Здравствуйте. Подскажите, пожалуйста. :)

Есть два класса:
//Главный.
Код AS3:

//Определяю пакет:
package src
{
        import flash.display.MovieClip;
 
        //Определяю класс:
        public class Practice extends MovieClip
        {
                //Определяю конструктор:
                public function Practice()
                {
                        //Определяю локальную переменную с инициаллизатором переменной объектом класса ForWork:
                        var h = ForWork;
 
                        h();
                        //Вызываю функцию из функции (у основного класса):
                        h.localWork('из основного класса');
                }
        }
}

//Не главный.
Код AS3:

//Определяю пакет:
package src
{
        function ForWork()
        {
                trace("Эта функция была вызвана!");
                //Определяю функцию функции с одним обязательным параметром.
                function localWork(place)
                {
                        trace("Подфункция вызвана");
                }
                //Вызываю подфункцию:
                //Присваиваю в качестве аргумента "место" откуда была вызвана эта функция
                localWork('из функции!');
        }
}

Когда я пишу h(), то функция класса ForWork начинает свою работу (осведомляет о своей запущенности).
А как я могу обратиться к функции (локальной функции) функции ForWork?

KumoKairo 06.02.2013 19:06

Поставить модификатор public перед определением локальной функции и обратиться через оператор "."
А вообще странно, проще сделать полноценный класс
Код AS3:

//Определяю пакет:
package src
{
        public class ForWork
        {
        public function ForWork()
        {
            trace("Конструктор");
        }
//Определяю функцию функции с одним обязательным параметром.
        public function localWork(place)
        {
              trace("Подфункция вызвана");
        }
    }
}

И обращаться потом через экземпляр класса
И насчет обязательного параметра - в определении надо (для компилятора не критично) писать тип входного параметра

Dip52 06.02.2013 19:27

Цитата:

Сообщение от KumoKairo (Сообщение 1119449)
И насчет обязательного параметра - в определении надо (для компилятора не критично) писать тип входного параметра

Тип входного параметра? Вы имеете в виду писать у параметра :String (например)?

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

Сообщение от KumoKairo (Сообщение 1119449)
Поставить модификатор public перед определением локальной функции и обратиться через оператор "."

Код AS3:

        //Определяю функцию:
        public function ForWork()
        {
                trace("Запущено!");
                //Определяю функцию:
                public function localWork()
                {
                        trace("Подфункция запущена!");
                }
        }

Вы имеете в виду так?

expl 06.02.2013 20:13

Цитата:

Код AS3:

function ForWork()
        {
                trace("Эта функция была вызвана!");
                //Определяю функцию функции с одним обязательным параметром.
                function localWork(place)
                {
                        trace("Подфункция вызвана");
                }
                //Вызываю подфункцию:
                //Присваиваю в качестве аргумента "место" откуда была вызвана эта функция
                localWork('из функции!');
        }


function localWork(place) - это не локальная функция. В as3 нет локальных функций.
На самом деле это анонимная функция (и не важно, что у неё есть имя)
Это то же самое, что:
Код AS3:

var localWork:Function = function (place):void
                {
                        trace("Подфункция вызвана");// Не подфункция это!
                }

Общепринятое правило(придерживаются все as3-разработчики, которых я знаю, кроме одного) - не использовать анонимные функции.
Так что можно не морочить себе голову и забыть про эту функцию как про страшный сон

Dip52 06.02.2013 20:53

Цитата:

Сообщение от expl (Сообщение 1119467)
function localWork(place) - это не локальная функция. В as3 нет локальных функций.
На самом деле это анонимная функция (и не важно, что у неё есть имя)
Это то же самое, что:
Код AS3:

var localWork:Function = function (place):void
                {
                        trace("Подфункция вызвана");// Не подфункция это!
                }

Общепринятое правило(придерживаются все as3-разработчики, которых я знаю, кроме одного) - не использовать анонимные функции.
Так что можно не морочить себе голову и забыть про эту функцию как про страшный сон

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

expl 06.02.2013 21:04

Цитата:

Значит анонимные и вложенные функции это одно и тоже?
Угу, по-крайней мере работают с теми же проблемами и с тем же захватом контекста, что и анонимки.

Цитата:

Про то, что нужно "забыть" такой метод я уже слышал. Только у меня вопрос почему.
В C#, F#, Ocaml, Python, Java(совсем недавно) тоже есть анонимные функции(лямбды) и там это хорошо
Но:
1. В этих языках они чаще используются не чтобы обработать что-то асинхронно по месту, а чтобы лаконично завернуть функциональную обработку данных
2. В этих языках есть оптимизации лямбды (например по возможностьи несоздание второго экземпляра лямбды), либо проблемы с лямбдами меркнут на фоне общей тормознутости языка (как в Python)
3. Даже в Python запретили делать анонимки размером больше одного выражения
Потому что читабельность падает!

Почему анонимки в AS3 плохо:
- не первый раз здесь это говорю, но на одном проекте после истребления анонимок потребление памяти упало с 800 до 200 Mб. Вобщем, надо быть _очень_ аккуратным, чтобы ничего не потекло при использовании анонимок
- нет никаких оптимизаций - создаются при каждом упоминании, захватывают весь контекст, даже если не надо, не обрабатываются JIT-компилятором
- падает производительность - просто доступ к обычным переменным становиться медленнее в разы(!)
- читабельность ухудшается.

KumoKairo 06.02.2013 21:50

Dip52, да, все именно так

Таки сделайте лучше полноценный класс)

Dip52 06.02.2013 22:43

Цитата:

Сообщение от KumoKairo (Сообщение 1119479)
Dip52, да, все именно так

Таки сделайте лучше полноценный класс)

В таком случае у меня комплилятр ругается на создание модификатора управления доступом внутри функции.
Я сделаю, как вы говорите, но мне интересно, как это (в смысле функция внутри функции) будет выглядеть. Сейчас просто эту тему прохожу у Колина Мука.

Добавлено через 37 секунд
Цитата:

Сообщение от expl (Сообщение 1119476)
Угу, по-крайней мере работают с теми же проблемами и с тем же захватом контекста, что и анонимки.


В C#, F#, Ocaml, Python, Java(совсем недавно) тоже есть анонимные функции(лямбды) и там это хорошо
Но:
1. В этих языках они чаще используются не чтобы обработать что-то асинхронно по месту, а чтобы лаконично завернуть функциональную обработку данных
2. В этих языках есть оптимизации лямбды (например по возможностьи несоздание второго экземпляра лямбды), либо проблемы с лямбдами меркнут на фоне общей тормознутости языка (как в Python)
3. Даже в Python запретили делать анонимки размером больше одного выражения
Потому что читабельность падает!

Почему анонимки в AS3 плохо:
- не первый раз здесь это говорю, но на одном проекте после истребления анонимок потребление памяти упало с 800 до 200 Mб. Вобщем, надо быть _очень_ аккуратным, чтобы ничего не потекло при использовании анонимок
- нет никаких оптимизаций - создаются при каждом упоминании, захватывают весь контекст, даже если не надо, не обрабатываются JIT-компилятором
- падает производительность - просто доступ к обычным переменным становиться медленнее в разы(!)
- читабельность ухудшается.

Ничего себе, такой большой разброс (800 - 200).

expl 07.02.2013 00:19

Цитата:

В таком случае у меня комплилятр ругается на создание модификатора управления доступом внутри функции.
Правильно - внутренних функций в AS3 нет (как и в Java, C#, C, C++, haXe). Вроде из популярных - только Pascal их имеет и при этом они не являются замыканиями.
Создайте обычный метод класса рядом, не надо его внутрь другого метода пихать

Цитата:

Ничего себе, такой большой разброс (800 - 200).
Например из метода вернули функцию, котрая возвращает какое-то число, но в этом методе ещё создавали битма-даты, причём не маленькие - функции они не нужны (или в будущем будут не нужны), но контекст захватился - и эти битмапы должны висеть в памяти. Т.е. тут проблема не в том что анонимная функция много весит (весит она мало), а в том, что она может зацепить что-то очень большое в памяти. И очень тяжело это отследить.
Если эти битмапы были в объекте - к объекту можно достучаться и переназначить их на более актуальные, а к захваченному функцией контенту - не достучишься - пока функция нужна - весь неактуальный мусор будет висеть в памяти.

А если представить что в одних анонимках, захвативших контекст в добавок создаются другие анонимки - уже захватывается и контекст главной анонимки и контекст ранее её захваченный у нормального метода - получается такое дерево из анонимок.
И пока _все_ ссылки на все анонимки этого дерева не похеришь - контексту нормального метода не видать сборщика мусора как своих ушей :)


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

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