CustomGames.ru - Dota 2 пользовательские игры

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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CryDeS

  • Друзья CG
  • 1200
  • Мощь: 12
Для начала необходимо уяснить что 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/

Оффлайн Slavko

  • Продвинутый
  • 224
  • Мощь: 5
  • -_-
Молодец, стараешься
+rep
Ландшафтеры, мастера фотошопа и скриптеры более-менее адекватного уровня - приглашаю за заманчивым предложением в скайп: vyacheslavmikh

Оффлайн -ErøtiC-

  • Администратор
  • 335
  • Мощь: 3
  • Забанен
Спасибо, добавил на главную http://customgames.ru/tutorial/globalnye-i-lokalnye-peremennye-v-lua

Оффлайн SoulAndris

  • 2
  • Мощь: 0
еще стоило бы сказать что есть сама такая переменная _G. И причем _G._G = _G. а теперь можно мозг положить на получку))))

Оффлайн CryDeS

  • Друзья CG
  • 1200
  • Мощь: 12
еще стоило бы сказать что есть сама такая переменная _G. И причем _G._G = _G. а теперь можно мозг положить на получку))))
Смотри под последний спойлер, ну я не сказал что сама _G есть одна большая таблица для всего, а про _G._G = _G я сказал :D

Оффлайн doter.ua

  • Друзья CG
  • 272
  • Мощь: 1
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

« Последнее редактирование: 19-07-2015, 21:27:39 от doter.ua »
гайды
сурпрайз mthfckr :D

[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1200
  • Мощь: 12
CryDeS, ты вроде разбираешься в луа, запили гайдецкий про ООП в луа (скорее его имитацию). У меня толком времени нету, а в двух словах не объяснишь.
Я с луа общаюсь примерно две недели, как пилю карту. До этого встречал только мельком :) Но я почитаю, посмотрим что за имитация :D

Оффлайн SoulAndris

  • 2
  • Мощь: 0
Код
local c

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

Оффлайн doter.ua

  • Друзья CG
  • 272
  • Мощь: 1
SoulAndris, за все время ни разу не понадобился свап переменных :)
гайды
сурпрайз mthfckr :D

[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1200
  • Мощь: 12
Код
local c

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