首页 文章

Lua checkudata C型

提问于
浏览
2

我已经到了谷歌的尽头,并试图解决这个问题 .

我有几个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 回答

  • 1

    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_testudata 替换 luaL_checkudata 就可以使它按预期工作 .

  • 0

    通过使用rawequal来解决注册表匹配的类 .

相关问题