[lua] Глобальные и локальные переменные

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Для начала необходимо уяснить что lua - язык регистрозависимый, то есть функция game и Game это две РАЗНЫЕ функции. Так же как и переменные local C и local c разные переменные! Много ошибок бывает из-за небольшой опечатки, которые бывает трудно отследить!
Так же необходимо понимать что доступ к локальным переменным гораздо быстрее нежели чем к глобальным, т.к локальные переменные хранятся в той части оперативной памяти выделенной для этого скрипта, когда как глобальные хранятся в общей среде скриптом(общей среде lua). По этому что бы не было лишних подвисаний, используйте локальные переменные где это позволяет ситуация!
Обращение к любой не объявленной переменной выдаст nil(пустой указатель/пустота)!

Собственно, в lua существует два типа переменных - глобальные и локальные. Глобальные доступны ВСЕМ скриптам в данном игровом режиме, локальные доступны только определенному "блоку" скрипта.
Что подразумевает под собой блок? Это участок кода внутри функции/конструкции ветвления(if/else)/цикл. Например, рассмотрим небольшой пример участка кода с участием локальной переменной.
Код:
local a = 100
if a == 100 then
 local b = 200
end
print(b) -- выдаст nil, т.к "b" существует ТОЛЬКО внутри блока if ... end
Перепишем чутка код.
Код:
local a = 100
local b
if a == 100 then 
 local b = 200
end
print(b) -- выдаст 200, т.к переменная b объявлена в том же блоке где и выводится.

Больше примеров богу примеров!
Код:
local c

function Swap(a, b) 
 c = a
 a = b
 b = c
end

function Main() -- допустим что это у нас вызывается первой функцией(в игре это InitGameMode())
 c = 50
 local a = 60
 local b = 30
 Swap(a,b)
 print(a,b,c) -- выдаст 30 60 60, т.к переменная c была объявлена в общем блоке, и дальше любая функция ее ПЕРЕЗАПИШЕТ!
end

А теперь о глобальных переменных.
Все глобальные переменные и параметры хранятся в некой таблице глобальных параметров lua. Это таблица называется _G (global)
Все необъявленые ранее глобальные переменные имеют nil по умолчанию. Так же очевидно что при необходимости удалить переменную, нужно просто присвоить ей nil
Объявляется глобальная переменная очень просто, достаточно присвоить ей значение
Код:
temp = 10
И после, она будет доступна во всем скрипте, но в другие скриптах такое объявление может не работать. Для того что бы передавать переменные в разные скрипты( например между addon_game_mode.lua и custom_my_megascript.lua) Необходимо вручную занести ее в таблицу глобальных переменных(_G). Сделать это довольно просто
Код:
_G.temp = 10
Все. Теперь переменная _G.temp будет доступна в любом скрипте данной среды(текущего игрового режима)
Чутка наркомании от lua, в _G хранятся все переменные, в том числе и сама _G. Так что _G._G = _G (мозг улетел и обещал не возвращаться)
Собственно это все основы которые необходимо знать о переменных lua любому кто тыкает в lua палкой.
Собственно, полезные статьи о lua:
О работе с переменными в lua:http://www.cronos.ru/kb-1512.html
Вообще о lua(крайне рекомендую): https://zserge.wordpress.com/2012/02/23/lua-%D0%B7%D0%B0-60-%D0%BC%D0%B8%D0%BD%D1%83%D1%82/
 
Последнее редактирование модератором:

SoulAndris

Новичок
14 Июл 2015
2
0
еще стоило бы сказать что есть сама такая переменная _G. И причем _G._G = _G. а теперь можно мозг положить на получку))))
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
еще стоило бы сказать что есть сама такая переменная _G. И причем _G._G = _G. а теперь можно мозг положить на получку))))
Смотри под последний спойлер, ну я не сказал что сама _G есть одна большая таблица для всего, а про _G._G = _G я сказал :D
 
Последнее редактирование модератором:

doter.ua

Продвинутый
17 Авг 2014
280
5
CryDeS, ты вроде разбираешься в луа, запили гайдецкий про ООП в луа (скорее его имитацию). У меня толком времени нету, а в двух словах не объяснишь.
ЗЫ вот небольшой экзампл, если нужен:
Код:
Hero = { -- типа родительский класс/таблица
  name = "name",
  level = 1,
  myPrint = function(me)
   print ( "I'm ".. me.name ..", my lvl is ".. tostring(me.level) )
  end
}
local tide = {} -- типа наследник
local axe = {} -- типа еще один

setmetatable(tide, {__index = Hero})
setmetatable(axe, {__index = Hero})

axe.level = 10
axe.name = "Axe"
tide.level = 25
tide.name = "Tide"

print( Hero:myPrint() )
print( tide:myPrint() )
print( axe:myPrint() )

-- OUTPUT
-- I'm name, my lvl is 1
-- I'm Tide, my lvl is 25
-- I'm Axe, my lvl is 10
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=doter.ua link=topic=217.msg1145#msg1145 date=1437341160]
CryDeS, ты вроде разбираешься в луа, запили гайдецкий про ООП в луа (скорее его имитацию). У меня толком времени нету, а в двух словах не объяснишь.
[/quote]
Я с луа общаюсь примерно две недели, как пилю карту. До этого встречал только мельком :) Но я почитаю, посмотрим что за имитация :D
 

SoulAndris

Новичок
14 Июл 2015
2
0
Код:
local c

function Swap(a, b)
 c = a
 a = b
 b = c
end
а смысл примера этой функции вообще не вижу. Ведь Lua язык с параллельным присваиванием.
и запись как
Код:
a,b = b,a
вполне должна легко сработать.
 

doter.ua

Продвинутый
17 Авг 2014
280
5
SoulAndris, за все время ни разу не понадобился свап переменных:)
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=SoulAndris link=topic=217.msg1150#msg1150 date=1437369693]
Код:
local c

function Swap(a, b) 
 c = a
 a = b
 b = c
end
а смысл примера этой функции вообще не вижу. Ведь Lua язык с параллельным присваиванием.
и запись как
Код:
a,b = b,a
вполне должна легко сработать.
[/quote]
Когда писал не придумал ничего очевиднее чем свап переменных, а так да, вы правы, a, b = b, a. Но для примера использования локальных переменных свап тоже пойдет ;)
 
Реклама: