我有一个用 C++ 编写的 CArray 类,并作为数组公开给 Lua。
1) 创建一个新的用户数据:
int Array_new(lua_State* L)
{
int len = luaL_checkint(L, 1);
CArray<std::string> **Arr = (CArray<std::string>**)lua_newuserdata(L, sizeof(CArray<std::string>*));
*Arr = new CArray<std::string>(len);
luaL_getmetatable(L, "ArrayMetatable");
lua_setmetatable(L, -2);
return 1;
}
2) 访问一个元素:
int Array_getValue(lua_State* L)
{
CArray<std::string>* arr = *(CArray<std::string>**)lua_touserdata(L, 1);
int pos=luaL_checknumber(L, 2)-1;
//Omitted for brevity
lua_pushstring(L, stdStr.c_str());
return 1;
}
3)注册到Lua:
int luaopen_Array(lua_State* L)
{
luaL_newmetatable(L, "ArrayMetatable"); // metatable1
luaL_setfuncs(L, Array_metatable, 0);
lua_pushstring(L, "__index");
lua_pushvalue(L, -2); // metatable1 __index metatable1
lua_settable(L, -3); // metatable1[__index]=metatable1
/*luaL_newmetatable(L, "ArrayMetatable_2"); // metatable1 metatable2
lua_pushstring(L, "__index"); // metatable1 metatable2 __index
lua_pushstring(L, "get"); // metatable1 metatable2 __index get
lua_gettable(L, 1); // metatable1 metatable2 __index
lua_settable(L, 2);
lua_pushvalue(L, 1); //metatable1 metatable2 metatable1*/
lua_setglobal(L, "Array");
return 0;
}
问题是我必须选择 Lua 代码来访问数组中的元素:a) arr:get(1)
获取第一个元素,b) arr[1]
得到第一个元素。
但是 a 和 b 不能同时工作,所以我必须更喜欢 style a 或 style b 强>。修改第3步是否可以同时做a和b?
到目前为止,如果我尝试使用 arr[2]
等 Lua 表达式,我提供的代码会在第 2 步 出现错误这样变量 arr
的地址是0xcccccc。
最佳答案
可以添加一个__index方法和一个get方法,分开添加即可。
关于c++ - 相同用户数据的 Lua 数组和面向对象访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46870449/