lua - 为什么我得到一个线程而不是我的参数?
问题描述
我正在使用我的 C/C++ 游戏中的 lua 5.3 来允许对其行为的某些部分进行脚本化。
在 C++ 程序中,每一帧我都main
以以下方式调用 lua 函数:
lua_getfield(VMState, LUA_GLOBALSINDEX, "main");
int result = lua_pcall(VMState, 0, 0, 0);
我希望脚本定义一个名为 的函数main
,它可以做很多事情。例如,我可以有一个执行以下操作的脚本:
local f = function()
draw_something({visible = true, x = 0, y = 0})
end
main = function()
f()
end
draw_something()
是对 C 代码的回调,它对传递的参数做了一些有趣的事情:
lua_getfield(VMState, 1, "visible");
bool visible = (bool)lua_toboolean(VMState, 2); lua_pop(VMState, 1);
if (!visible)
return;
// Do some other stuff
有趣的是,在调用此回调时,我在 lua 端作为参数传递给的匿名表现do_something
在位于堆栈位置 1,因此我可以lua_getfield()
从 C 端调用以访问该"visible"
字段,然后执行有什么东西。
这工作得很好,多年来我已经做了很多这样的事情。
现在,我想将 lua 调用转换f
为协程,所以我从 lua 端做这样的事情:
local f = function()
draw_something({visible = true, x = 0, y = 0})
end
local g = coroutine.create(function()
while true do
f()
coroutine.yield()
end
end
main = function()
coroutine.resume(g)
end
结果应该是一样的。然而,现在事实证明,通过将调用移动到draw_something()
协程内部,我传递给函数的参数,本来应该是一个表,现在是一个线程?(lua_istable()
返回 0,而lua_isthread()
返回 1)。
有趣的是,我向函数传递了多少参数并不重要:0、1、4、50,从回调内部我只得到一个参数,它是一个线程。
出于某种原因,我导出的一些函数会发生这种情况,但不是全部。不过,我看不出导出不同功能的方式有什么不同。
lua 是否有任何理由将我的参数切换到线程?
解决方案
我找到了答案。
事实证明,lua_State
在 a 上传递给你的那个lua_CFunction
不能保证和你第一次得到的一样lua_newstate()
我想每个协程都可能有自己独立的lua_State
. 如果你总是lua_State
在.lua_newstate()
lua_State
lua_CFunction
推荐阅读
- c# - 如何在 Linq 语句中获取多个链接子项的父/源项?
- java - Android无法在内部存储上创建目录
- scala - Array((1L, 2L)) 是做什么的?
- google-text-to-speech - Google text-to-speech (Wavenet) 是否有每种支持语言的日期格式列表?
- batch-file - 用bat文件替换文件夹和子文件夹中的文件名
- asp.net - 将模型项目(EntityFramwork)添加到 Asp.net Core 3 项目
- python - 限制 Bokeh Server 上 DataTable 中显示的行数
- c# - 使用错误的 app.config 从另一个启动应用程序
- java - 如何解决 SonarQube 中的主要问题“不必要地装箱一个布尔常量”
- prestashop - 在管理页面上找不到“GET /”的路由