如何在 Lua 中逐行运行代码(单线程)?
2020-6-25 14:30:14
收藏:0
阅读:323
评论:1
我在 Lua 编程方面遇到了一些困难。我发现 Lua 不像 Python 一样逐行执行代码。因此,我无法将变量更新为从循环或 if/else 语句中获取的值。值仅在 if/else 或循环块内更新,但在块后,变量返回其初始值或 nil,而不是更新后的值。我希望我表达清楚了。请帮帮我。 以下是代码片段:
local list = {}
function refresh_applist()
apps_gen.generate(function (applist) -- 回调函数
list = applist -- 将值分配给变量 list
naughty.notify({text = type(list[10])}) -- 等价于 print(type(list[10]))&输出 'table'
end)
naughty.notify({text = type(list[10])}) -- 输出 nil
end
以下是 apps_gen.generate 的功能
function apps_gen.generate(callback)
-- 更新类别输入的图标
apps_gen.lookup_category_icons()
local result = {}
local unique_entries = {}
local dirs_parsed = 0
for _, dir in ipairs(apps_gen.all_menu_dirs) do
utils.parse_dir(dir, function(entries)
entries = entries or {}
for _, entry in ipairs(entries) do
-- 检查是否应将程序包含在菜单中
if entry.show and entry.Name and entry.cmdline then
local unique_key = entry.Name .. '\0' .. entry.cmdline
if not unique_entries[unique_key] then
local target_category = nil
-- 检查程序是否落入至少一个可用类别中,将 target_category 设置为找到的第一个类别的 ID。
if entry.categories then
for _, category in pairs(entry.categories) do
local cat_key, cat_use =
get_category_name_and_usage_by_type(category)
if cat_key and cat_use then
target_category = cat_key
break
end
end
end
local name = utils.rtrim(entry.Name) or ""
local cmdline = utils.rtrim(entry.cmdline) or ""
local icon = entry.icon_path or nil
table.insert(result, { name = name,
cmdline = cmdline,
icon = icon,
category = target_category })
unique_entries[unique_key] = true
end
end
end
dirs_parsed = dirs_parsed + 1
if dirs_parsed == #apps_gen.all_menu_dirs then
callback(result)
end
end)
end
end
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?

如何在 Lua 中逐行顺序运行代码(单线程)?
Lua 脚本会逐行进行解释,因此自然而然地是按顺序执行的。你不需要进行任何操作就可以实现它。
创建一个名为
list的本地表:local list = {}创建一个名为
refresh_applist的全局函数,不需要传入参数:function refresh_applist() apps_gen.generate(function (applist) list = applist naughty.notify({text = type(applist[10])}) end) naughty.notify({text = type(applist[10])}) -- 输出 nil end如果稍后调用
refresh_applist,它会调用一个名为apps_gen.generate的函数,并将一个匿名函数作为其唯一参数。接着它会调用
naughty.notify({text = type(applist[10])}),这可能在某个地方输出applist[10]的类型。实际提供的代码中不存在applist。如果你没有提到脚本错误,那么它很可能是一个表值,否则你将不能对其进行索引,因此不会输出nil。如果匿名函数被调用,它将把其参数
applist分配给其上值list,还会调用naughty.notify({text = type(applist[10])})。但这次的applist是它的本地参数,不是上面未知值。回应您的评论和修改,添加更多代码:
这是因为(至少在提供的代码中)回调函数之外不存在
applist。applist是回调函数局部范围内的函数参数。在回调外面,除非你在正确的范围内早先创建了另一个applist,它就是nil。由于表是按引用传递的,
applist实际上是一个对result的引用,其回调被调用时就传入了该引用。当你试图在回调函数之外调用
type(applist[10])时,应该会得到 Lua 错误,因为你在对nil进行索引。