问题标签 [lua-5.3]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
lua-5.3 - 为什么lua不尊重我的SIGINT信号
我正在运行 Lua 代码。(附在下面)。代码运行良好,但是当我尝试使用CTRL + C
它发送 SIGINT 时不尊重它。
我如何实现这一点,并确保 CTRL+C 受到 Lua 程序的尊重。
我尝试使用posix.signal
但没有用。
c++ - 管理 Lua 轻量级用户数据的正确方法
我有void *
一个 C++ 创建的对象,我使用lua_pushlightuserdata()
. Lua 可以通过将轻量用户数据传递给 Lua CFunctions 并使用lua_touserdata()
. 在将来的某个时刻,C++ 对象被其所有者 (C++) 破坏,释放内存并设置为 null。但是,Lua 仍然有这个指针的引用,它并不知道它已经被销毁了。
现在我的 Lua 函数接受这个用户数据确保指针是有效的。但是通知 Lua 他们对轻用户数据的引用不再有效的最佳方法是什么?我是否IsValid(lightuserdata)
向 Lua 公开了一个函数以便它可以查询状态?或者有没有更好的方法,我错过了。
lua - 调用 String.pack 返回未找到打包方法
我正在运行 Zerobrane 1.8 和 LUA 5.3。但是,在解释器中,字符串函数没有“pack()”方法/子函数,即
返回错误:“打包方法为零。”
我已经在其他在线版本的 lua 解释器中尝试过,但遇到了同样的问题。然而,参考手册
https://www.lua.org/manual/5.3/manual.html#pdf-string.pack 清楚地表明这个函数应该存在。我在这里想念什么?
c - Lua 打印性能,Windows 与 Linux
使用 C,有
并打电话
到全局 (entity->luaFun = "entity_update")
在一个循环中(单个游戏帧)大约需要:
- 使用 Windows*的128个实体为 0.2 秒
- 使用 Linux 的8096实体需要 0.2 秒**
使 Windows 的构建速度比 Linux 慢大约 64 倍(同一台机器,运行的应用程序减少到最低限度,都使用 100% 的单核)。
造成如此巨大差异的原因可能是什么?请参阅下面的评论和编辑。
* Windows 10,Mingw-w64,来自:“MingW-W64-builds”,使用 Lua 5.3.5 二进制版本
** Mint 16、gcc、Lua 5.3.5 来自官方来源
- 编辑
正如评论中所建议的那样,我试图在不打印任何消息和 BINGO 的情况下测量性能!没有任何类型的打印性能几乎可以匹配 Linux 版本。
现在,我尝试将打印替换为:
-
-
但他们的表现都是一样的。
我还尝试从 Windows 命令运行程序,这比在 CLion 中捕获的控制台快约 30%。
有什么技巧可以让它在 Windows 上更快吗?在 lua 部分中提供日志记录实用程序会很棒,但即使是调试,这对于实时应用程序来说也太慢了。
另:更改标题
lua - REPL 和脚本之间的 Lua 语法规则有何不同?
我很少使用 Lua,所以这可能是一个微不足道的问题,但我只是注意到使用 Lua 5.3.2,在交互式 REPL 中我可以编写例如:
这就是我在 Bash 或 Perl 中执行错误处理的方式(或者当然左边的语句or
在实际代码中会更有用,例如两个变量)。
但是,如果我粘贴1 == 2 or error('numbers not equal')
到某个文件中foo.lua
,然后lua foo.lua
在lua: foo.lua:1: unexpected symbol near '1'
.
我可以接受这是无效的语法,但我觉得很奇怪 REPL 会接受这个语句。有人可以解释这里发生了什么吗?是否有一些关于我在 REPL 中可以做什么而我在脚本中不能做的一般规则?
c++ - 更改 lua_thread 的 _ENV(使用 C API)
这适用于多人游戏,其中 NPC 脚本将作为函数块加载并缓存在单个 lua_State 上,然后每次玩家与 NPC 交互时,都会创建一个新的 lua_thread,从全局 lua_table 获取缓存的函数并推送到线程的堆栈上,然后线程被恢复(npc 脚本在完成之前产生了几次)。
我正在尝试使用 C API 更改 lua 线程的环境,以便已加载/运行的函数将无法更改全局变量/让它们被运行在不同线程上的其他函数更改。
通过将此代码添加到脚本的开头,我通过更改函数环境实现了预期的结果。但是,我想使用 C API 端来执行此操作,这样我就不必将此代码粘贴到每个脚本中。
示例代码 + 所需/当前输出
npcA.lua
npcB.lua
我希望 npcA 打印
和那个 npcB 打印
当前的输出是(这不是我想要的)
如果 npcA 先运行 npcB 将打印
如果 npcB 先运行然后让步,则 npcA 运行,然后 npcB 恢复。npcB 会打印
这是有问题的
lua - 为什么我的 LUA 解释器不能处理字符串键值?
在使用预定义脚本和 LUA 运行时环境测试代码时,LUA 不会采用任何形式的字符串键值。但是,如果使用数值键,LUA 将按预期使用它。当我使用带有 LUA 文件的 Tshark 来解析数据包捕获时,此规则的例外情况。这允许字符串键值语法正常工作。有什么我可能做错了吗?
我尝试创建几个具有不同变体的 .lua 脚本文件,包括:
testArray.NewItem = "value1" testArray["NewItem"] = "value1"
NewItemValue = "NewItem" testArray[NewItemValue] = "value1"
由于尝试调用 nil 值,这些都会导致 nil 值或错误,具体取决于用于检查的返回样式。
tcpstream[stream1] = "nothing" 之后的 print(#tcpstream) 的输出应该显示 1 而不是零。随后的 print(tcpstream[1]) 也应该显示“无”。
lua-table - 如何将字符串转换为 lua 代码以从嵌套表中读取值
我有一个表获取函数的可配置值,我将其作为输入字符串。我需要将该字符串作为代码执行并从嵌套表中获取一个值。
我尝试使用load(string)
,它不工作
print(load(string))
应该打印value1
。
c++ - 从 C++ 为字符串函数设置 _ENV
在我的项目中,我正在执行 XML 文件中包含的一些 lua 函数。我从 C++ 读取 XML,解析代码字符串,执行它们并获得结果。我发现的所有相关问题要么使用专用.lua
文件,要么直接在 Lua 中完成,但我找不到适合我的情况的解决方案。
我无法修改文件中的函数,它们都具有以下签名:
从 C++ 我像这样加载它们:
一切正常,但从 XML 字符串运行任意 Lua 代码似乎不太安全,所以我想设置代码可以使用的函数白名单。
在这个lua-users 讨论之后,我创建了允许的函数列表,例如:
问题是我不明白如何加载它以便在我调用的函数中可用。
我试着像在 lua-users 网站上那样做:
但这会导致函数没有正确加载和 Lua 错误
尝试执行字符串值
我也尝试过:
在执行加载的 XML 函数之前,这不会使程序崩溃,但也不会_ENV
为被调用函数设置。
我发现拥有我想要的唯一方法是使用 C++ 搜索解析函数字符串()
,在它之后插入,whitelist
然后两次执行它。luaL_loadstring
lua_pcall
像这样:
这有效并为该函数设置了我的自定义 _ENV,但在我看来,这是一种非常老套的方法。
如何以更好的方式为从 C 加载的字符串函数设置 _ENV 变量?
如果有一种方法可以为整个保存一次lua_State
而不是每次调用函数时都可以加分。
lua - 管理 Lua 5.3 “.0” 行为
在 Lua 5.3 中,当一个数字是没有任何小数部分的浮点数时,打印它会在其末尾添加“.0”,在高尔夫和速度比赛中给我错误的答案。舍入或~~x
强制x|0
它为整数类型,但对于像“求均值”这样可能是整数或小数的问题,只需打印 sum/size 每次它是整数时都会给出错误的答案,因为它以“.0”而不是什么都没有。因此,需要进行额外的检查,添加字符来编写高尔夫解决方案和额外的测试以及编写代码以加快运行速度。除了请求竞赛持有者在他们的答案中接受以“.0”结尾的整数之外,有没有什么好的方法来处理这种行为?