|
|
|||||
Регистрация: Jun 2009
Сообщений: 56
|
Func.apply с сохранением контекста?
Есть способ вызвать функцию с массивом параметров, как Func.apply, но при этом сохранить изначальный контекст функции?
Наткнулся в проекте на вот такую вещь, это делающую. Неужели нельзя сделать красивее? /** * Calls the given function with the arguments in the given array, similar to Function::apply(). In contrast to * apply(), splat() will preserve the `this' value of the function, if any. * * The arguments array cannot be longer than 5 elements. * * @param target The function to be called * @param args The arguments args to call it with * @return The return value of the function, if any */ public function splat(target : Function, args : Array) : * { switch( args.length ) { case 0: return target(); case 1: return target(args[0]); case 2: return target(args[0], args[1]); case 3: return target(args[0], args[1], args[2]); case 4: return target(args[0], args[1], args[2], args[3]); case 5: return target(args[0], args[1], args[2], args[3], args[4]); } } |
|
|||||
Modus ponens
|
А почему нельзя просто контекст сохранить вместе с параметрами функции?
Вообще в АС специально для того, чтобы хранить контекст (состояние) данных вместе с функцией используются объекты. Как-то странно искать обходной путь вместо того, чтобы использовать штатную возможность.
__________________
Hell is the possibility of sanity |
|
|||||
Можно сделать посимпатичнее:
public function Test() { callMethod(trace3Args, "1", "2", "3", "4", "5"); } private function callMethod(method:Function, ...args):void { args.length = method.length; method.apply(null, args); } private function trace3Args(arg1:String, arg2:String, arg3:String):void { trace(arg1, arg2, arg3); }
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
|
|||||
Регистрация: Jun 2009
Сообщений: 56
|
Цитата:
В этот момент контекст теряется, вы же передаёте null вместо него. |
|
|||||
Modus ponens
|
Я не знаю, чем отличаются функции возврата от других функций. Но если бы передо мной стала задача работать с библиотекой, которая в интерфейсе ожидает функции, а не какие-то друге объекты, а мне обязательно нужен был бы контекст во время выполнения функций, то я бы передавал библиотечному коду ссылки на методы объектов, т.как объект - это самый естесственный и привычный способ хранить контекст вызова функции.
__________________
Hell is the possibility of sanity |
Часовой пояс GMT +4, время: 04:53. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|