我已经到了谷歌的尽头,并试图解决这个问题 .
我有几个userdata对象,我从C推送到Lua . 我有一个函数应该获得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类型,它只能在上面的代码中工作 .
2 回答
lua(L)_check*
函数在失败时抛出Lua错误,lua(L)_to*
函数返回NULL
. 无论出于何种原因,这个与命名约定不同,而是命名为lua(L)_test*
,这使得它更难找到 .你的代码是不完整的,并且不会被检查,但如果我没有弄错,只需用
luaL_testudata
替换luaL_checkudata
就可以使它按预期工作 .通过使用rawequal来解决注册表匹配的类 .