Делегаты и 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>. The supported tag styles are: <foo>, [foo].
  • Use [gist:####] where #### is your gist number to embed the gist.

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

CAPTCHA
Для отсева спамеров
n
M
L
2
2
S
Enter the code without spaces and pay attention to upper/lower case.