Как известно, после выхода патча 1.24 было запрещено использование Return Bag (RB), позволяющее конвертировать идентификатор integer в тип handle. Вместо него Blizzard создала новые Native функции, компенсирующие утрату. Я расскажу о функциях и hashtable.
Без багов никуда
Как ни жаль, приходится начинать с багов, которые пришли с нововведениями. А именно раздел "хеш-таблица" в редакторе триггеров, вмещающий в себя функции работы с hashtable. Самое худшее здесь пожалуй то, что для работы используются функции BJ, т.е. как обычно функция в функции с другим порядком аргументов. Может это сделано для удобства использования на GUI, но такой вариант всегда будет презираться оптимизаторами кода. Т.е. использование BJ-функций - это первый минус. Второй - это то, что почему-то на GUI интерфейсе реализованы функции для работы с типами переменных, доступных только на JASS, например, trackable (трекабли). Клик на указание объекта сохранения приводит к вылету редактора. Третьим будет не то, чтобы баг, скорее недоработка. В GUI вставлены далеко не все функции, например, там нет функции RemoveSavedHandle() или RemoveSavedInteger(), что они делают, думаю, понятно. Ещё один, мне кажется, не такой значительный минус - это отсутствие работы с типом code.
Собственно песня
Новые функции и работа с ними очень похожи на gamecach, разве что вместо string для задания адреса используется integer и hashtable находится в памяти, а gamecach на винте, из чего делается вывод о превосходстве скорости работы hashtable над gamecach.
InitHashtable()
Функция создаёт новую hashtable.
Берёт: ничего
Возвращает: hashtable SaveUnitHandle(table, parent, child, which)
Сохраняет юнит в hashtable под указанным адресом.
Берёт:
table - hashtable, в который нужно сохранить юнит
parent - "ряд" таблицы
child - "столбец" таблицы
which - сохраняемый юнит
Возвращает: true, если удалось сохранить юнит, иначе false.
Примечание: для всех типов переменных для сохранения своя функция (SaveImageHandle(), SaveGroupHandle(), SaveHashtableHandle()...). Очень жаль нету функции для сохранения самого типа handle.
LoadUnitHandle(table, parent, child)
Достаёт из таблицы юнит, записанный по указанному адресу.
Берёт:
table - hashtable, из которого нужно извлечь юнит
parent - "ряд" таблицы
child - "столбец" таблицы
Возвращает: юнит, расположенный по указанному адресу.
Примечание: для этой функции аналогичная предыдущей особенность.
HaveSavedHandle(hash, parent, child)
Проверяет наличие в hashtable handle по указанному адресу.
Берёт:
table - hashtable, адрес которого нужно проверить
parent - "ряд" таблицы
child - "столбец" таблицы
Возвращает: true, если по адресу действительно сохранён какой-нибудь handle.
Примечание: Для типов не-handle свои аналоги (HaveSavedBoolean(), HaveSavedInteger(), HaveSavedReal(), HaveSavedString())
FlushChildHashtable(table, parent)
Очищает все "столбцы" "ряда" в hashtable.
Берёт:
table - очищаемый hashtable
parent - "ряд" таблицы
Возвращает: ничего
FlushParentHashtable(table)
Полностью очищает всю hashtable.
Берёт: table - очищаемый hashtable
Возвращает: ничего
RemoveSavedHandle(table, parent, child)
Удаляет handle, записанный в hashtable по указанному адресу.
Берёт:
table - hastable, из которой удаляется значение
parent - "ряд" таблицы
child - "столбец" таблицы
Возвращает: ничего
Примечание: для типов не-handle свои аналоги (RemoveSavedBoolean(), RemoveSavedInteger(), RemoveSavedReal(), RemoveSavedString())
Вот и всё. Спасибо Blizzard за патч. © 2009