Если у вас есть переменная tes
и вы определите local function tes()
, она просто перезапишет переменную tes
.Точнее, это будет затенять его, но это действительно не имеет значения.
Вы также не можете объявлять локальные переменные на лету, так что об этом не может быть и речи;Однако вы можете объявлять глобальные переменные, потому что они даже не реальные переменные, а пары ключ-значение в таблице, называемой глобальной средой.
В Lua 5.1 и более ранних версиях вы можете получить доступ к глобальной средечерез значение _G
;в Lua 5.2 и выше вы также можете вместо этого использовать переменную _ENV
, но _G
все еще работает для вашей цели.
Чтобы добавить новую «глобальную» переменную, вы можете просто проиндексировать эту таблицу и добавитьновая пара ключ-значение к нему:
for _, letter in ipairs {'a', 'b', 'c', 'd', 'e'} do
_G[letter] = function() print(letter) end
end
a() --> prints "a"
b() --> prints "b"
-- etc.
Но вы должны помнить следующее:
local name = 'John'
local tab = {}
-- These are all equivalent:
tab[name] = 'Doe' -- Gets the actual contents of name, which is 'John'
tab['John'] = 'Doe'
tab.John = 'Doe'
-- After any of those, tab looks like this: {John = 'Doe'}
-- (Which is the same as {['John'] = 'doe'})
-- This one is different though:
tab.name = 'Doe'
-- After this, tab looks like this: {name = 'Doe'}
-- (Which is the same as{['name'] = 'Doe'} )
Так что, если у вас есть переменная tes
, которая содержит строку,ты должен сделать
_G[tes] = function()
-- Do stuff with tes
end