Полагаю, это будет многочастный ответ ...
Лексическая область видимости
Типичный пример:
do
local foo = 20
function bar() return foo end
end
print(tostring(foo)) -- prints "nil", foo is out of scope
print(bar()) -- prints 20, bar still knows about foo
В вашем случае все наоборот
function bar() return foo end
-- foo does not exist as a local yet, so Lua tries accessing a global foo
do
local foo = 20
print(tostring(bar())) -- prints nil because bar doesn't know foo
end -- forget about local foo
foo = 30 -- global
local foo = 20
print(bar()) -- prints 30, because it doesn't know the local foo
Ваша проблема
Это в основном то, что происходит в вашем примере.Вы объявляете переменную player
после функции, поэтому к моменту объявления функции не существует локальной переменной player
, поэтому она компилирует функцию, которая обращается к глобальной переменной player
.Так как этот глобал не существует, он рассматривается как ноль, и когда вы пытаетесь проиндексировать его, Луа жалуется.
Исправления
- Либо удалите
local
и сделайте player
aглобальная переменная (это легко сделать, но глобальные переменные - это дьявол, и вы не должны использовать их легкомысленно) - Или объявите ее с помощью
local player
над функцией, затем вы можете присвоить ей значение ниже.
Обратите внимание, что функция будет сохранять переменную , а не ее значение при создании функции.Вот пример того, что я имею в виду:
local foo = 20
function bar() return foo end
foo = 30
print(bar()) -- prints 30, not 20
Это нечто большее, но это все, что вам нужно знать, чтобы решить вашу проблему.Если вы хотите узнать больше, просто поищите лексику в lua, и вы наверняка найдете объяснения лучше, чем я когда-либо мог бы дать вам.