以下代码段
local function foo ()
print('inside foo')
bar()
end
local function bar ()
print('inside bar')
end
foo()
产生以下输出
inside foo
lua: teste.lua:3: attempt to call global 'bar' (a nil value)
stack traceback:
teste.lua:3: in function 'foo'
teste.lua:10: in main chunk
[C]: ?
如果我从local
声明中删除修饰符bar
,则它按预期方式工作,输出
inside foo
inside bar
如何在bar
内调用foo
并将两者都保持为local
?
答案 0 :(得分:4)
您需要在bar
之前定义foo
。
local function bar ()
print('inside bar')
end
local function foo ()
print('inside foo')
bar()
end
foo()
在您的示例中,当您位于foo
函数内部时,就Lua而言,bar
尚不存在。这意味着它默认为值为nil
的全局变量,这就是为什么会出现错误“试图调用全局'bar'(nil值)”的原因。
如果要在foo
之前定义bar
并将它们都保留为局部变量,则需要先声明bar变量。
local bar
local function foo ()
print('inside foo')
bar()
end
function bar ()
print('inside bar')
end
foo()
在此示例中,如果您想证明bar
是局部变量,则可以在末尾添加以下代码:
if _G.bar ~= nil then
print("bar is a global variable")
else
print("bar is a local variable")
end
这将检查“ bar”是否为全局变量表_G
中的键。
答案 1 :(得分:1)
事实上:
local function foo () end
等同于
local foo
foo = function() end
在Lua中,函数是一等值。因此,在定义它之前不可用。