如何调用需要从其创建之上调用的函数?我读到了一些关于转发声明的东西,但是Google在这种情况下帮不上忙。这方面的正确语法是什么?
发布于 2011-05-20 13:31:06
Lua是一种动态语言,而函数只是一种可以用()
运算符调用的值。因此,您实际上不需要向前声明函数,只要确保在调用它时作用域中的变量是您认为的变量即可。
对于包含函数的全局变量来说,这根本不是问题,因为全局环境是解析变量名的默认位置。然而,对于局部函数,您需要确保局部变量在需要调用它存储的值的词法点处已经在作用域中,并且还需要确保在运行时它确实持有一个可以调用的值。
例如,下面是一对相互递归的本地函数:
local a,b
a = function() return b() end
b = function() return a() end
当然,这也是使用尾部调用来允许不做任何事情的无限递归的一个示例,但这里的重点是声明。通过在其中存储函数之前使用local
声明变量,就可以知道这些名称是本例其余部分的词法范围内的局部变量。然后存储这两个函数,每个函数引用另一个变量。
发布于 2011-05-20 19:06:25
您可以通过在声明实际的函数体之前声明函数的名称来向前声明函数:
local func1
local func2 = function()
func1()
end
func1 = function()
--do something
end
然而,只有在声明具有局部作用域的函数时,才需要正向声明。这通常是您想要做的,但Lua也支持更像C的语法,在这种情况下,向前声明是不必要的:
function func2()
func1()
end
function func1()
--do something
end
发布于 2014-07-31 02:09:52
在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值)
颠倒顺序确实起作用了。
https://stackoverflow.com/questions/6067369
复制相似问题