Lua Checkudata类型C

Lua checkudata type C++

我到过Google的尽头,然后再次尝试解决此问题。

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

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

这是我尝试的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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类型时,它才能在上面的代码中起作用。


luaL_testudata

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

This function works like luaL_checkudata, except that, when the test fails, it returns NULL instead of raising an error.

lua(L)_check*函数在失败时引发Lua错误,lua(L)_to*函数返回NULL。无论出于何种原因,该名称都偏离了命名约定,而是命名为lua(L)_test*,这使得查找起来有点困难。

您的代码不完整,无法按原样编译,因此我不会费心检查,但如果我没有记错的话,只需将luaL_checkudata替换为luaL_testudata即可使其正常工作。<铅>


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