WarCraft 3: 12. Статичные условия

vJass

Статичные условия объявляются посредством ключевого слова static, перед ключевым словом if:
static if conditions then
	// ...
else
	// ...
endif
Они имеют 2 основных отличия от обычных условий:
  1. Выражения внутри статичных условий могут состоять только из логических констант и операторов and/not
  2. Проверка статичных условий выполняется на этапе компиляции - блок кода, не удовлетворяющий условию, будет исключен из кода карты
globals
	constant boolean MY_BOOLEAN = true
endglobals

function MyFunc takes nothing returns nothing
	static if MY_BOOLEAN then
		call BJDebugMsg("The constant has a value of TRUE!")
	else
		call BJDebugMsg("The constant has a value of FALSE!")
	endif
endfunction
В представленном выше примере, в зависимости от значения константы MY_CONSTANT, во время компиляции будет удален блок кода не соответствующий условию.
В предыдущем параграфе мы говорили об опциональных зависимостях библиотек и специальной константе LIBRARY_Name, так давайте посмотрим, как это можно использовать в сочетании со статичными условиями:
library A uses optional B
    function fun takes nothing returns nothing
        local unit u = GetTriggerUnit();
        static if LIBRARY_B then
            call B_Remove(u);
        else
            call KillUnit(u);
        endif
    endfunction
endlibrary

library B
    public function Remove(unit u)
        call BJDebugMsg("Unit kill!");
        call RemoveUnit(u);
    endfunction
endfunction
Согласно нашему условию, если в коде карты присутствует библиотека B, парсер сохранит строку вызова функции Remove, а вызов функции KillUnit будет удален из кода. Ну а в случае отсутствия востребованной библиотеки, вместо специальной функции Remove библиотеки B, будет использована стандартная нативка KillUnit.
Если бы мы не воспользовались статичным условием, то компилятор бы по прежнему не выдал ошибку, в случае отсутствия библиотеки B, однако, возникла бы ошибка компиляции при попытке найти функцию B_Remove.

Просмотров: 332

Комментарии пока отсутcтвуют