Lua checkudata type C++

我已经走遍了 Google 的尽头,试图解决这个问题。

我有一些从 C++ 推送到 Lua 的 userdata 对象。 我有一个函数应该获取一个 2D 或 3D 对象的 X 值。

当我尝试获取 userdata 对象时,考虑到它可能是 2D 元素或 3D 对象,我需要能够获取用户选择的任一对象的 X。

这是我尝试的:

int getX(lua_State* L)
{
Object3D* a = static_cast<Object3D*>(luaL_checkudata(L, 1, "Object3D"));
if (!a)
{
Object2D* b = static_cast<Object2D*>(luaL_checkudata(L, 1, "Object2D"));
if (b)
{
lua_pushnumber(L, b:getX());
}
else
{
lua_pushnil(L);
}
}
else
{
lua_pushnumber(L, a:getX());
}
return 1;
}

不幸的是,如果 userdata 类型不是 Object3D,则会在 lua 错误上失败并退出,而不继续尝试 Object2D。 因此,如果传递的对象属于 Object3D 类型,则仅在上述代码中有效。

点赞
用户8150130
用户8150130

通过使用 rawequal 来查看注册表匹配的类来解决问题。

2017-09-15 04:26:58
用户805875
用户805875

luaL_testudata

void *luaL_testudata (lua_State *L, int arg, const char *tname);

这个函数与luaL_checkudata类似,但在测试失败时,它返回 NULL而不是引发错误。

lua(L)_check* 函数在失败时抛出 Lua 错误,而 lua(L)_to* 函数返回 NULL。不知什么原因,这个函数与命名约定不同,将其命名为 lua(L)_test*,这使得它有点难以找到。

你的代码不完整,无法直接编译,因此我无法检查。但如果我没有错,只需将 luaL_checkudata 替换为 luaL_testudata 就可以按预期工作。

2017-09-15 05:31:56