Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正向定义Lua中的函数?_Lua_Forward Declaration_Coronasdk - Fatal编程技术网

正向定义Lua中的函数?

正向定义Lua中的函数?,lua,forward-declaration,coronasdk,Lua,Forward Declaration,Coronasdk,如何调用需要从其创建上方调用的函数?我读了一些关于转发声明的文章,但谷歌在这方面没有帮助。正确的语法是什么?Lua是一种动态语言,函数只是一种可以用()操作符调用的值。因此,您实际上不需要向前声明函数,只要确保在调用时作用域中的变量就是您认为它是的变量 对于包含函数的全局变量来说,这根本不是问题,因为全局环境是解析变量名的默认位置。但是,对于局部函数,您需要确保局部变量已经在需要调用它存储的值的词法点的作用域中,并且还需要确保在运行时它确实保存了一个可以调用的值 例如,下面是一对相互递归的局部函

如何调用需要从其创建上方调用的函数?我读了一些关于转发声明的文章,但谷歌在这方面没有帮助。正确的语法是什么?

Lua是一种动态语言,函数只是一种可以用
()
操作符调用的值。因此,您实际上不需要向前声明函数,只要确保在调用时作用域中的变量就是您认为它是的变量

对于包含函数的全局变量来说,这根本不是问题,因为全局环境是解析变量名的默认位置。但是,对于局部函数,您需要确保局部变量已经在需要调用它存储的值的词法点的作用域中,并且还需要确保在运行时它确实保存了一个可以调用的值

例如,下面是一对相互递归的局部函数:

local a,b
a = function() return b() end
b = function() return a() end

当然,这也是一个使用尾部调用来允许不做任何事情的无限递归的例子,但这里的重点是声明。通过在任何一个变量中存储函数之前用
local
声明变量,这些名称在本例其余部分的词法范围内被称为局部变量。然后存储这两个函数,每个函数引用另一个变量

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

local func1
local func2 = function()
  func1()
end
func1 = function()
  --do something
end
但是,只有在声明具有本地作用域的函数时,才需要向前声明。这通常是您想要做的,但Lua也支持更像C的语法,在这种情况下,不需要前向声明:

function func2()
  func1()
end
function func1()
  --do something
end

在Freeswitch中的嵌入式lua下测试,正向声明不起作用:

fmsg("CRIT", "It worked.")
function fmsg(infotype, msg)
   freeswitch.consoleLog(infotype,  msg .. "\n")
end
结果:

[ERR]mod_lua.cpp:203/usr/local/freeswitch/scripts/foo.lua:1:尝试调用全局“fmsg”(一个nil值)


颠倒顺序确实(duh)起作用。

如果我试图在定义之前调用函数,则对我不起作用。我正在nginx conf中使用这个Lua脚本

lua条目线程中止:运行时错误:lua_重定向。lua:109:尝试调用全局“throwErrorIfAny”(一个nil值)

代码片段-

...
throwErrorIfAny()
...

function throwErrorIfAny()
    ngx.say("request not allowed")
    ngx.exit(ngx.HTTP_OK)
end
鉴于其他一些答案也指出它对他们也不起作用,Lua的前向声明可能不适用于其他工具


PS:如果我将函数定义放在前面,然后在后面调用它,效果会很好。

要理解Lua中的前向引用与C相比的工作原理,您必须理解C编译和Lua执行之间的根本区别

  • 在C语言中,前向引用是一种编译时机制。因此,如果在C模块中包含转发声明模板,那么下面的任何代码都将在编译调用时使用此模板。您可以在同一模块中包含函数实现,也可以不包含,在这种情况下,两个声明必须在语义上相同,否则编译器将出错。由于这是一个编译时构造,编译后的代码可以按任何顺序执行

  • 在Lua中,前向引用是一种运行时机制,即编译后的函数在代码内部生成函数原型,但这只能在执行完成后作为运行时Lua变量或值进行访问 传递创建Lua闭包的声明。在这里,源中的声明顺序无关紧要。执行顺序很重要:如果闭包尚未绑定到变量,则执行将抛出“nil value”异常。
    如果使用局部变量保存函数值,然后,正常的局部作用域规则仍然适用:
    local
    声明必须在源代码中使用之前,并且必须在范围内,否则编译器将在错误的全局或外部局部引用中编译。所以,正如在其他答案中所讨论的那样,使用局部变量进行前向引用是可行的,但前提是在执行第一个调用之前,Protos绑定到闭包


如果您使用OOP,您可以调用其“定义”之前的任何函数成员

程序输出:

f1
later
f2
later

好的,谢谢。我自己设法找到了答案,但这个答案还是有用的。事实上,你的第一个示例没有达到你认为的效果,因为第二个
local func1
声明了一个该名称的新变量,并将第一个
func1
设置为孤立,仍然设置为
nil
。你的第二个示例也很糟糕,因为从func1下面天真地调用“func2”是可行的,但不是因为任何形式的“前向声明”。相反,func1是在全局环境(_G)中声明的,当func2查找func1时,它会检查_G。这意味着func1是在运行func2之前声明的,因此当它检查_G时,它会工作。在定义func2后立即引发func2调用将导致错误。。。因为func1没有声明/定义。这就是为什么我说“但是只有在声明具有本地作用域的函数时才需要前向声明”。换句话说,我明确地说第二个示例不使用前向声明。
f1
later
f2
later