本地函数相互调用
2016-7-21 13:6:33
收藏:0
阅读:85
评论:3
我有两个函数偶尔相互调用,并且它们是模块的本地函数,该模块使用它们构建另一个函数。 该模块与此代码段相似:
local function iseven(n)
if n == 1 then
return false
else
return isodd(n - 1)
end
end
local function isodd(n)
if n == 1 then
return true
else
return iseven(n - 1)
end
end
local evenOrOdd = function(n)
return iseven(n) and "Even" or "Odd"
end
return evenOrOdd
问题是,当从另一个文件调用 evenOrOdd 时,我会收到错误 attempt to call global 'isodd' (a nil value)。
我注意到,如果将 iseven 设置为全局,就不会出现这种情况,但是我希望将它们保留为模块本地函数。
我甚至尝试在声明 iseven 的行之前放置虚拟函数声明(local function isodd() end)。 我还尝试在虚拟函数声明的位置插入 local isodd,但在两种方式中都不起作用,并且我会收到不同类型的错误。
我知道这是因为Lua有闭包,当声明 iseven 时,它会捕获 isodd 的实际值,该值是 nil 或虚拟函数,之后的修改不起作用,但是有没有办法绕过这个问题?
点赞
用户107090
问题在于iseven中对isodd的调用使用了_全局_变量,而非后面定义的局部变量。
可以按照 @Egor 的建议使用前向声明:
local iseven, isodd
function iseven(n)
...
end
function isodd(n)
...
end
...
2016-07-21 12:27:43
用户3586583
另一种解决这个问题的方法是使用表格。普通局部变量可能更有效率,但是通过表格,无需管理声明。
local T = {}
local function evenOrOdd(n)
return T.iseven(n) and "Even" or "Odd"
end
function T.iseven(n)
-- 代码
end
这个方法的要点是,因为表格在顶部已经定义了,它下面的所有内容都可以访问它,您可以动态更改它的内容。当调用 evenOrOdd 时,T.iseven 应该已经定义,即使在 evenOrOdd 定义时它没有被定义。
2016-07-21 14:07:26
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
更好的检查
num%2- 除法运算的余数