Область видимости Lua
В книге автора языка программирования Lua написано:
В отличие от глобальных переменных, область видимости локальной переменной ограничена блоком, где она была объявлена. Блок — это тело управляющей структуры, тело функции или кусок кода (файл или строка, где переменная была объявлена).
-- 1 блок
do
x = 1
end
print (x) -- переменная x из глобальной области видимости доступна!
-- Почему так происходит ? Ведь блок это место где существования переменной
-- заканчивается... ( если я правильно понимаю суть Блок'ов)
:-> 1
-- 2 блок функции
function foo ()
y = 2
print (x)
return y
end
print (foo())
-- Здесь так же...
:-> 1
:-> 2
-- переменные x, y доступны из глобальной области видимости! При
-- том, переменная x внутри другого блока!
Насколько я понял, Блок доступен после его объявления, и мне не понятно еще вот такой код:
do
function f()
n = 'A'
return n
end
end
print (n)
:-> nil
do
function f()
n = 'A'
return n
end
f()
end
print (n)
:-> A
Насколько я понял, В отличие от глобальных переменных, область видимости локальной переменной ограничена блоком, где она была объявлена. Блок — это тело управляющей структуры, тело функции или кусок кода (файл или строка, где переменная была объявлена). - это не работает, если надо чтобы переменная было локальной то надо ее обьявлять с local иначе обьявления переменной внутри любого Блока не делает ее локальной. (если я ошибаюсь пожалуйтса обьясните с примером если можно.)
Ответы (1 шт):
Это такая фишка Lua - глобальные переменные по умолчанию. Если переменную написать внутри блока, она будет глобальной. Чтобы она стала локальной к тому блоку внутри которого написана, нужно написать перед ней local и только тогда она станет локальной.
Если например написать local x в файле и больше ничего, то она будет локальная для файла.
Все глобальные переменные хранятся в таблице _G.
Интересный факт еще, то что локальные переменные работают быстрее, но их количество ограничено для каждого блока ~250, так как по сути они являются регистрами для виртуальной машины. (нужно всегда писать типо вот-так для скорости local sin=math.sin)