首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Lua中正向定义函数?

在Lua中正向定义函数?
EN

Stack Overflow用户
提问于 2011-05-20 12:07:58
回答 4查看 19.7K关注 0票数 24

如何调用需要从其创建之上调用的函数?我读到了一些关于转发声明的东西,但是Google在这种情况下帮不上忙。这方面的正确语法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-20 13:31:06

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

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

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

代码语言:javascript
复制
local a,b
a = function() return b() end
b = function() return a() end

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

票数 39
EN

Stack Overflow用户

发布于 2011-05-20 19:06:25

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

代码语言:javascript
复制
local func1
local func2 = function()
  func1()
end
func1 = function()
  --do something
end

然而,只有在声明具有局部作用域的函数时,才需要正向声明。这通常是您想要做的,但Lua也支持更像C的语法,在这种情况下,向前声明是不必要的:

代码语言:javascript
复制
function func2()
  func1()
end
function func1()
  --do something
end
票数 12
EN

Stack Overflow用户

发布于 2014-07-31 02:09:52

在Freeswitch中嵌入lua的测试中,转发声明不起作用:

代码语言:javascript
复制
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值)

颠倒顺序确实起作用了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6067369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档