Итак, мы добрались к одному из самых интересных возможностей vJass
Библиотеки
Библиотека (library) - отрезок кода, который будет объявлен независимо от его положения в коде сразу после объявление глобальных переменных и выше
Объявляется так:
Code
library <имя>
//тело библиотеки, сюда могут входить структуры, функции и т.д
endlibrary
Так же библиотеки могут ссылаться друг на друга:
Code
library A uses B
endlibrary
Это значит, что в библиотеки second содержится функция, вызывающая функцию в библиотеке A, следовательно библиотека B будет размещена выше по коду.
Пример:
Code
library A requires B
function SomeFunc takes nothing returns nothing
call MainTest()
endfunction
endlibrary
library B
function MainTest takes nothing returns nothing
call DoSomething()
endfunction
endlibrary
Место uses может быть использовано requires или needs, все три обозначения компилируются одинаково.
Также возможна следующая конструкция:
library A uses B, C
Это значит что библиотека A будет объявлена ниже B и C.
Важно отметить, что если библиотека A будет ссылаться на библиотеку B, а B на А это приведет к синтаксической ошибке.
Самоинициализация библиотек
Рассмотрим случай, когда мы написали какую либо систему, и поместили ее в библиотеку. Но для ее работы нам необходимо запустить ее инициализацию, к примеру присвоить значения глобальным переменным, создать некоторые объекты и т.д.
Для этого используется такая конструкция:
Code
library A initializer Init
endlibrary
Это значит, что в функцию main() (для тех кто не знает она запускается при загрузке карты) будет включен запуск функции Init в отдельном потоке.
Пример:
Code
library A initializer Init
function Init takes nothing returns nothing
set udg_c = GetSpellAbilityUnit()
endfunction
endlibrary
Надо заметить, что инициализация библиотек объявлена выше инициализации глобальных переменных.
Области
Области (scope) - по сути те же библиотеки, с различием в том, что они будут объявлены не вверху кода, а на своем реальном месте
Области объявляются так же, как и библиотеки но с отличием в ключевом слове(вместо library используется scope)
Приватные конструкции
Как я и обещал я опишу приватные конструкции(что это и зачем это надо). Приступим Приватные конструкции работают в областях и библиотеках (за исключением приватных переменных в структурах)
Приватные переменные
Приватные переменные обычно используются что бы не было повторяющихся названий. Например:
У нас есть код:
Первый случай:
Code
globals
unit u
endglobals
Второй случай:
Code
library spell
globals
private unit u
endglobals
endlibrary
В первом случае(вне библиотеки) мы сможем обращаться к переменной u с любой части кода, однако во втором случае мы можем обращаться к переменной только внутри библиотеки, тем самым ограничив область видимости переменной.
Code
library spell
globals
private unit u
endglobals
function myfunc takes nothing returns nothing
set u=GetSpellAbilityUnit()
endfunction
endlibrary
Этим кодом мы установим значение переменной u из категории globals нашей библиотеки.
Такой же трюк можно провести и функциями:
Code
library spell
globals
private unit u
endglobals
private function myfunc takes nothing returns nothing
set u=GetSpellAbilityUnit()
endfunction
endlibrary
Теперь при попытке обратится к функции myfunc извне мы получим ошибку
Приватные конструкции.
Используется ключевое слово public и что бы обратится к нужному объекту используем
<Имя области/библиотеки>_<имя нужного объекта>
Пример:
l
Code
ibrary spell
globals
unit u
endglobals
public function myfunc takes nothing returns nothing
set u=GetSpellAbilityUnit()
endfunction
endlibrary
Обращение будет так
call spell_myfunc()
Заключение
Ну вот и подошла к концу наша лекция. В следующей(и возможно финальной) мы познакомимся с макросами. Задание всё тоже, но обновить свой спелл с использованием вышеописанные фишек.
Что не ясно - спрашиваем.