Местонахождение любой заданной переменной всегда можно определить из источника, поэтому, если вы программируете на чистом Lua, я не вижу никакой цели этого. Я полагаю, что это может быть полезно в тех случаях, когда вы, возможно, выполняете некоторую предварительную обработку, поэтому вот один из способов сделать это без необходимости зависеть от имени:
local variable
print(debug.getupvalue(function()variable()end, 1) ~= "_ENV")
function()variable()end
, для локальной переменной, захватит ее как повышающее значение (debug.getupvalue
вернет "variable"
). Если вместо variable
разрешается глобальная переменная, функция должна хранить вместо этого глобальное окружение _ENV
в качестве повышающего значения (которое индексируется с именем переменной). Нет необходимости вызывать variable
в функции, это просто кратчайший способ ее «использовать». Если variable
равно _ENV
, оно всегда печатает false
(даже если _ENV
всегда локально).
Еще одна опция, которая работает правильно для _ENV
:
local variable
print(debug.getupvalue(function()_ENV(variable)end, 2) ~= nil)
function()_ENV(variable)end
всегда захватывает _ENV
, а также variable
, если он локальный, поэтому проверка второго индекса определяет, была ли переменная локальной или нет.
Это работает с Lua 5.2 и далее.
Для решения без использования библиотеки отладки вы можете временно установить метаметод __newindex
на _ENV
, присвоить некоторые значения и проверить, вызывается ли метаметод.