是否可以检查变量是全局变量还是局部变量?我的意思是使用编程工具而不是通过阅读代码来做到这一点? 例如
print(type(a))=>"number",
print(checklocal(a))=>true
答案 0 :(得分:0)
变量在一定范围内是局部的。是的,您可以通过调用debug.getlocal(StackLevel, Index)
来访问任何活动函数的局部变量,它返回两个值:
变量值
-- Example
local isGlobal = 99
function testFunc(var)
local v1, v2, v3 = 1, 2, 3
local a = 1
while true do
local name, value = debug.getlocal(1, a)
if not name then break end
print(name, value)
a = a + 1
end
end
testFunc('xyz')
-- Result
-- var xyz
-- v1 1
-- v2 2
-- v3 3
-- a 5
local isGlobal = 99
在我们的testFunc()
范围之外,因此getlocal不会打印它,而在testFunc范围内的所有其他变量都将打印其值。
答案 1 :(得分:0)
任何给定变量的局部性始终可以从源代码中确定,因此,如果您使用纯Lua编程,我将看不到任何目的。我想它可能在您进行一些预处理的情况下很有用,所以这是一种处理方法,而不必依赖名称:
local variable
print(debug.getupvalue(function()variable()end, 1) ~= "_ENV")
对于局部变量, function()variable()end
将其捕获为高值(debug.getupvalue
将返回"variable"
)。如果将variable
解析为全局变量,则该函数必须将全局环境_ENV
存储为upvalue(使用变量名建立索引)。无需在函数中调用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
元方法,在周围分配一些值,并检查是否调用了该元方法。