Введение
Иногда может понадобиться сохранить определенный список аргументов функции, чтобы потом вызвать её с нужными параметрами.
Описание
- Сохранить аргументы с функцией в объект:
namefunction.save(arg1,arg2...) -> int obj,
где namefunction - имя оригинальной функции,
(arg1,arg2...) - её аргументы.
- Вызвать:
frun(int obj)
- Вернуть значения:
namefunction.namepar1, namefunction.namepar2,
где nameparN - имя возвращаемого параметра
- Удалить (очистить):
fdel(int obj)
---Пример---
function test_1 takes integer a, integer b returns nothing
test_1.ret(a+1,b-1)
endfunction
//! runtextmacro FUNC2("test_1","integer","integer")
//! runtextmacro RET2("test_1","integer","i1","integer","i2")
function test_2 takes integer a, integer b, real c returns nothing
printr(a+c,b+c)
endfunction
//! runtextmacro FUNC3("test_2","integer","integer","real")
function MyCode1 takes nothing returns nothing
integer save = test_1.save(1,5)
frun(save)
fdel(save)
save = test_2.save( test_1.i1, test_1.i2, 10. )
frun(save)
fdel(save)
endfunction
Выведет:
a+c 12.000; b+c 14.000
Дополнительно
о количестве аргументов
Система легко масштабируется, но с увеличением масштаба тяжело вводить архитектурные изменения. Сжать код не получилось из за словленного бага с define.
Установка
Поддерживаются функции не более чем с 6 аргументами.
Число возвращаемых параметров не более 4.
Число возвращаемых параметров не более 4.
Список поддерживаемых типов данных
Возможно расширить в любой момент по аналогии.
(string)
(destructable)
(effect)
(integer)
(item)
(lightning)
(multiboard)
(multiboarditem)
(player)
(real)
(rect)
(region)
(timer)
(trigger)
(unit)
Список изменений (02.01.2020)
- Добавлено введение, описание, дополнительно, установка;
- Добавлен деструктор. Теперь можно очистить объект-функцию;
- Исправлена очистка функций, добавлен возврат нескольких значений;
- Единый деструктор для всех функций. Переход к ExecuteFunc() от ForceEnumPlayers() из-за мультивызовов.
Скопировать папки ProtoClass, SaveFunction.
Скачать:
SaveFunction.w3m
SaveFunction.w3m
Ред. Clamp
Ред. Jack-of-shadow
Единственное передача атрибутов там не встроена, для этого используются глобалки. Функции для передачи я расширяю по мере надобности, так как обычно хватает индекса игрока.
А, так у тебя тоже фильтры только не через хеш? Тогда это даже шустрее будет
Сомнительный функционал в рамках варкрафта
Подсветка, запуск, билд, скиньте подробные мануалы, чтобы можно было их сравнить с предыдущими и проверить работоспособность на 1.26 и 1.31.
Или, может, есть парсер cjass -> lua, или хотя бы vjass -> lua?
Ведь большое количество проектов были написаны с использованием этих диалектов, есть ли возможность облегчить им переход?
Ред. Doc
Запускать можно множеством способов, начиная от копипастинга кода в редактор и запускания прямо оттуда, заканчивая билд системами, такими как github.com/ElusiveMori/ceres-wc3
Я использую обычный .bat скрипт, в котором одна строка копирует файл карты, другая вставляет в нее мой код (с помощью MPQEditor.exe), а третья запускает варкрафт с этой картой.
Многих может шокировать невероятно, но близзард и так уже конвертируют жасс в луа, поэтому такой парсер уже есть в стандартной поставке. Либо этот github.com/actboy168/jass2lua
Другой вариант - xgm.guru/p/wc3/jassnewgenpack-lua#lastpost
Ред. Vlod
По поводу подсветки запуска и билда - просил готовые решения или рабочие мануалы.
По поводу парсера - это неюзабельно для невысококвалифицированной части аудитории, почему-то ничего не сказали по поводу поддержки старых диалектов. Можете оставить этот юмор при себе? Или вы предлагаете для каждой функции вручную описывать замыкания? Эта наработка как раз избавляет от этого разработчика, делая всё в одну строку. Более того, замыкания в луа несколько иначе интерпретируются в jass, чем тут, стоило прежде обратить на это внимание.
Ред. Doc
Для людей, которые пытаются выглядеть особо умными и знающими, но по факту таковыми не являющимися и пишущими бред вроде "замыкания в луа несколько иначе интерпретируются в jass" (в jass замыканий нет, это высказывание де факто смысла не имеет), привожу пример НЕ требующий никаких библиотек, менеджмента ресурсов или запуска мусорных макросов (советую сравнить с примером в основном посте):
Ред. Vlod
Логики я здесь, извините, не вижу.
Ред. Doc
Ред. PT153
Vlod, ресурс можно скрыть.
Ред. Vlod