在Lua中定义一个函数?

Ell*_*lle 20 lua forward-declaration coronasdk

如何调用需要从其创建之上调用的函数?我读了一些关于前向声明的内容,但谷歌在这种情况下并没有帮助.这个的正确语法是什么?

RBe*_*eig 33

Lua是一种动态语言,函数只是一种可以通过()运算符调用的值.所以你真的不需要向前声明函数,以确保调用它时的变量是你认为的变量.

对于包含函数的全局变量,这根本不是问题,因为全局环境是查找解析变量名的默认位置.但是,对于本地函数,您需要确保局部变量已经在您需要调用它存储的值的词汇点的范围内,并且还要确保在运行时它实际上保存了一个可以调用的值.

例如,这是一对相互递归的本地函数:

local a,b
a = function() return b() end
b = function() return a() end
Run Code Online (Sandbox Code Playgroud)

当然,这也是使用尾调用来允许无效递归的示例,但这里的重点是声明.通过在将变量local存储在其中之前声明变量,已知这些变量是本示例其余部分的词法范围内的局部变量.然后存储两个函数,每个函数引用另一个变量.


jho*_*ing 11

您可以在声明实际函数体之前通过声明其名称来声明函数:

local func1
local func2 = function()
  func1()
end
func1 = function()
  --do something
end
Run Code Online (Sandbox Code Playgroud)

但是,只有在声明具有局部范围的函数时才需要前向声明.这通常是你想要做的,但是Lua也支持更像C的语法,在这种情况下,前导声明不是必需的:

function func2()
  func1()
end
function func1()
  --do something
end
Run Code Online (Sandbox Code Playgroud)

  • 实际上,你的第一个例子没有做你认为它做的事情,因为第二个`local func1`声明了该名称的*new*变量,并使第一个`func1`孤立并仍然设置为`nil`. (4认同)
  • 这就是为什么我说“但是只有在声明具有本地作用域的函数时才需要前向声明”。换句话说,我明确表示第二个示例不使用前向声明。 (3认同)