Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.02.2013, 18:31
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 1  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
По умолчанию Как вызвать функцию функции класса?

Здравствуйте. Подскажите, пожалуйста.

Есть два класса:
//Главный.
Код 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?

Старый 06.02.2013, 19:06
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 2  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Поставить модификатор public перед определением локальной функции и обратиться через оператор "."
А вообще странно, проще сделать полноценный класс
Код AS3:
//Определяю пакет:
package src
{
	public class ForWork
	{
         public function ForWork()
        {
             trace("Конструктор");
         }
//Определяю функцию функции с одним обязательным параметром.
         public function localWork(place)
         {
              trace("Подфункция вызвана");
         }
    }
}
И обращаться потом через экземпляр класса
И насчет обязательного параметра - в определении надо (для компилятора не критично) писать тип входного параметра

Старый 06.02.2013, 19:27
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 3  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от KumoKairo Посмотреть сообщение
И насчет обязательного параметра - в определении надо (для компилятора не критично) писать тип входного параметра
Тип входного параметра? Вы имеете в виду писать у параметра :String (например)?

Добавлено через 2 минуты
Цитата:
Сообщение от KumoKairo Посмотреть сообщение
Поставить модификатор public перед определением локальной функции и обратиться через оператор "."
Код AS3:
	//Определяю функцию:
	public function ForWork()
	{
		trace("Запущено!");
		//Определяю функцию:
		public function localWork()
		{
			trace("Подфункция запущена!");
		}
	}
Вы имеете в виду так?

Старый 06.02.2013, 20:13
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Код AS3:
function ForWork()
	{
		trace("Эта функция была вызвана!");
		//Определяю функцию функции с одним обязательным параметром.
		function localWork(place)
		{
			trace("Подфункция вызвана");
		}
		//Вызываю подфункцию:
		//Присваиваю в качестве аргумента "место" откуда была вызвана эта функция
		localWork('из функции!');
	}
function localWork(place) - это не локальная функция. В as3 нет локальных функций.
На самом деле это анонимная функция (и не важно, что у неё есть имя)
Это то же самое, что:
Код AS3:
var localWork:Function = function (place):void
		{
			trace("Подфункция вызвана");// Не подфункция это!
		}
Общепринятое правило(придерживаются все as3-разработчики, которых я знаю, кроме одного) - не использовать анонимные функции.
Так что можно не морочить себе голову и забыть про эту функцию как про страшный сон

Старый 06.02.2013, 20:53
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 5  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от expl Посмотреть сообщение
function localWork(place) - это не локальная функция. В as3 нет локальных функций.
На самом деле это анонимная функция (и не важно, что у неё есть имя)
Это то же самое, что:
Код AS3:
var localWork:Function = function (place):void
		{
			trace("Подфункция вызвана");// Не подфункция это!
		}
Общепринятое правило(придерживаются все as3-разработчики, которых я знаю, кроме одного) - не использовать анонимные функции.
Так что можно не морочить себе голову и забыть про эту функцию как про страшный сон
Значит анонимные и вложенные функции это одно и тоже? Про то, что нужно "забыть" такой метод я уже слышал. Только у меня вопрос почему.

Старый 06.02.2013, 21:04
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Значит анонимные и вложенные функции это одно и тоже?
Угу, по-крайней мере работают с теми же проблемами и с тем же захватом контекста, что и анонимки.

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

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


Последний раз редактировалось expl; 06.02.2013 в 21:15.
Старый 06.02.2013, 21:50
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 7  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Dip52, да, все именно так

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

Старый 06.02.2013, 22:43
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 8  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от KumoKairo Посмотреть сообщение
Dip52, да, все именно так

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

Добавлено через 37 секунд
Цитата:
Сообщение от expl Посмотреть сообщение
Угу, по-крайней мере работают с теми же проблемами и с тем же захватом контекста, что и анонимки.


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

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

Старый 07.02.2013, 00:19
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 9  
Ответить с цитированием
expl

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

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

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


Последний раз редактировалось expl; 07.02.2013 в 00:30.
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:34.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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