在一个局部函数中调用另一个局部函数

下面的代码片段

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]: ?

如果我从bar的声明中去掉修饰符local,那么它就像预期的那样工作,输出

inside foo
inside bar

我如何在保持barfoo两个函数为local的情况下调用bar函数?

点赞
用户5287638
用户5287638

在定义 foo 函数之前,需要先定义 bar 函数。

local function bar ()
    print('inside bar')
end

local function foo ()
    print('inside foo')
    bar()
end

foo()

在这个例子中,当你在 foo 函数内部时,Lua 认为 bar 还不存在。这意味着它默认为一个值为 nil 的全局变量,这就是为什么你会出现错误 "attempt to call global 'bar' (a nil value)"。

如果你想先定义 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 中的键,即全局变量表。

2018-09-26 15:11:29
用户10318548
用户10318548

实际上:

local function foo () end

等同于

local foo
foo = function() end

在 Lua 中,函数是第一类值。因此,在定义之前不能使用它。

2018-09-27 04:00:03