Делегаты и callback

В качестве ещё одного сниппета не могу не рассказать и о callback.
Тем, кто только начинает знакомиться с haXe, это весьма полезное предложение может быть и не знакомо, т.к. до недавнего времени не упоминалось в документации.
Да и сейчас добраться до него не просто. Так что линк на статью про reserved keywords в главе мануала о классах будет уместен. В статье описывается сам принцип работы callback. Переведу самое основное...

callback - это предложение, которое существует во всех классах haxe, но не является функцией или переменной, т.е. не может быть переопределено.
Если в классе имеется функция func(a,b){...}, то callback(func,"mystring") это то же, что и function(b) { return func("mystring", b); }, с одним важным отличием. Аргументы callback ("mystring" в нашем случае) вычисляются во время его создания, а не во время выполнения функции.
Далее автор приводит пару примеров, объясняющих это поведение, которые все желающие могут посмотреть и сами.

Я же хотел рассказать о callback немного с иной стороны, близкой и понятной ActionScript программистам. А именно о том, что благодаря этому предложению, они могут забыть о таких вещах как необходмость создания делегатов и всяческих Proxy для передачи аргументов этим самым делегатам. Далее чуть подробнее об этом...

Многие знают о том, что в haXe существует такая приятная вещь, как автоматическое делегирование.
Особенна она приятна тем, кто перешёл на haXe c AS2, т.к. отпадает необходимость думать о делегатах, настраивать их и заниматься прочими нудными и мало кому интересными вещами.

// То есть, вместо импортирования класса делегата и написания в AS чего либо типа:
nc.someFunc = Delegate.create(this, myFunc);
//  в классе haXe мы пишем просто:
nc.someFunc = myFunc;
// и компилятору не нужно быть телепатом, чтобы догадаться,
// что мы хотим делегировать выполнение nc.someFunc методу нашего класса myFunc.

Но остаётся один вопрос, а что делать, если в автоматически созданный делегат нужно передать какие-либо дополнительные параметры из того кода, которые его и создаёт? В AS2 для этого использовались различные прокси, которые люди или писали сами или брали готовые решения от разработчиков, которые их уже создали и выложили в открытый доступ (я, например, пользовал ascb.util.Proxy или constantiner.util.DelegateProxy).
В haXe же я никогда не использовал ничего подобного, так как в нём имеется callback.
// т.е. для добавления к аргументам myFunc, кроме аргументов someFunc,
// ещё и моей переменной myVar просто пишем:
nc.someFunc = callback(this.myFunc, myVar);

И всё. Как написал один из участников рассылки, поведавший мне о callback, "про кошмар с делегатами в ActionScript можно забыть" :)

Комментарии

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>.

Подробнее о форматировании

CAPTCHA
Этот вопрос помогает предотвратить автоматический спам
Image CAPTCHA
Enter the characters shown in the image without spaces, also respect upper and lower case.
To prevent automated spam submissions leave this field empty.