Lua元表中写入/索引值

我尝试将我的C++ vec3实现到Lua中。但是我有问题覆盖任何值。同时我知道我并没有真正使用原始的向量类。我猜有更好的实现方法。

我想要做的是:

Lua:

testvec = vec3(17,33,-822);
print(tostring(testvec.x)); // 正常工作

testvec.x = 1337; // 报错: 尝试索引vec3值 (全局 'vec3')

c++:

static int _set_x(lua_State* L) {
    luaL_checkudata(L, 1, LUA_Vector3);
    lua_pushnumber(L, luaL_checknumber(L, 2));
    lua_setfield(L, -2, "x"); // 这里报错
    return 0;
}

当我创建新的lua\ _State时执行的内容:

namespace lua_vec3
{
    static int _new(lua_State* L)
    {
        if (lua_gettop(L) == 3)
            *reinterpret_cast<Vector3**>(lua_newuserdata(L, sizeof(Vector3*))) = new Vector3(luaL_checknumber(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3));
        else
            *reinterpret_cast<Vector3**>(lua_newuserdata(L, sizeof(Vector3*))) = new Vector3();

        luaL_setmetatable(L, LUA_Vector3);
        return 1;
    }

    static int _delete(lua_State* L) {
        delete* reinterpret_cast<Vector3**>(lua_touserdata(L, 1));
        return 0;
    }

    static int _set_x(lua_State* L) {
        //(*reinterpret_cast<Vector3**>(luaL_checkudata(L, 1, LUA_Vector3)))->x = (luaL_checknumber(L, 2));
        luaL_checkudata(L, 1, LUA_Vector3);
        lua_pushnumber(L, luaL_checknumber(L, 2)); lua_setfield(L, -2, "x");
        return 0;
    }

    static int _get_x(lua_State* L) {
        //lua_pushnumber(L, (*reinterpret_cast<Vector3**>(luaL_checkudata(L, 1, LUA_Vector3)))->x);
        luaL_checkudata(L, 1, LUA_Vector3);
        lua_getfield(L, 1, "x");
        lua_pushnumber(L, luaL_checknumber(L, -1));
        return 1;
    }
}

static void register_vector3(lua_State* L)
{
    lua_register(L, LUA_Vector3, lua_vec3::_new);
    luaL_newmetatable(L, LUA_Vector3);

    lua_pushcfunction(L, lua_vec3::_delete); lua_setfield(L, -2, "__gc");
    lua_pushvalue(L, -1); lua_setfield(L, -2, "__index");

    lua_pushnumber(L, 3.4); lua_setfield(L, -2, "x");

    lua_pushcfunction(L, lua_vec3::_set_x); lua_setfield(L, -2, "set_x");
    lua_pushcfunction(L, lua_vec3::_get_x); lua_setfield(L, -2, "get_x");
    lua_pop(L, 1);
}

原文链接 https://stackoverflow.com/questions/69890156

点赞