Lua-программирование для чайников

Содержание:

7.0. Динамическая типизация.

Важно помнить, что Луа — язык с динамической типизацией. Это значит, что тип в языке связан не с переменной, а с её значением. Одна и та же переменная может принимать значения разных типов:
a = "the meaning of life" --> была строка,<br/>
a = 42                    --> стало число

7.1. Глобальные переменные.

Это присваивание переменной какого-либо значения до тех пор, пока ей не присваивается какое-либо другое значение:
abc = 15;  
a = b;  
ght = f;
Можно записывать сразу несколько переменных:
x,y = y,x;  
1,2,3 = 3,2,1;  
a,b,c,d,e,f,g = g,f,e,d,c,b,a;  
d,j,t = s,l,m;
Пример:
a = 1;  
b = 2;  

if a == 1 then  
  a = b;
end  

if rawequal(a,b) then  
  print(a); -- 2  
end
Вы должны понять главное: что если прописать символы, то эта автоматически становится глобальной переменной.
a --НЕВЕРНО! здесь обязательно нужно прописывать знак "=", иначе выдаст ошибку. В отличии от локалок, где такое допускается
далее
a = 1 --это уже считается глобалкой

7.2. Локальные переменные.

Отличаются от глобальных тем, что локальная переменная может принимать любое значение, а для глобального присвоение присваиваемое значение должно при этом существовать как переменная.
Также присваивание теряется, дойдя до ближайшего end либо else, либо elseif. Если объявить переменную вне всяких выражений, она останется навсегда. Объявляется с помощью оператора local:
local a1 = a; -- переменная а на какое-то время имеет значение a1
local a1,b1,c1 = a,b,c;
Не следует забывать, что перед знаком равно пишется значение, которое присваивается переменной, а после — сама переменная.
К этому оператору ещё вернёмся.
Как уже было сказано выше, локальные переменные объявляются на время скрипта:
Пример:
var = 45;  
if var then
  local v = var;
  print(v);  
end -- всё, v больше не имеет значения
или
if flag then
  local a = 0;
else -- всё, a больше не имеет значения
 
end 
или
function my_func()
	local a = 0
end --a больше не имеет значение
или можно создать область видимости для локалок, пример do .. end
do
local a = 1

end --a больше не имеет значение
возьмем пример с таймером варика:
--триггер отслеживает приказы
local trigger_order = CreateTrigger()
TriggerRegisterPlayerUnitEvent(trigger_order, Player(0), EVENT_PLAYER_UNIT_ISSUED_ORDER, nil)
TriggerAddAction( trigger_order, function()
	local u = GetTriggerUnit()
    
	TimerStart(CreateTimer(), 0.00, false, function()
		 --После смерти у юнита срабатывает приказ undefend от способности Adef, короче должна начаться реинкарнация
		
		--внутри тела таймера располагается локалка u. скока нам приходилось раньше на хэш-таблицу записывать. Если можно напрямую. Тут функция таймера находится ниже, чем локалка, поэтому она видима.
		if IsUnitType(u, UNIT_TYPE_DEAD) then  
		
		ernd
	end)
end
или
--выполняется цикл от 1 до 12 с шагом +1
for a=1, 12 do --переменная a в конструкции является локалкой
	local b = 1
end --b больше не имеет значение
Локалку можно объявлять где-угодно, в отличии от вариковского jass, где объявление локалок шло в верхней части кода.
Что будет если a была глобалкой, а после объявить локалку с таким же именем? глобалка станет локалкой. и перезапишется
a = 1 --эта переменная a является глобалкой
local a = 0 --эта переменная a стала локалкой, перезаписываем a
print(a) --вернет 0
Таким образом, одну и ту же переменную можно объявлять много раз в разных скриптах.
По возможности лучше всегда использовать локальные переменные — они помогают избежать хаоса в скриптах, лишних имён и прочего.
Да и длинные обращения можно урезать до одной буквы, тогда это сильно сэкономит время.

`
ОЖИДАНИЕ РЕКЛАМЫ...