Я разрабатываю библиотеку программного обеспечения для проектов электроники в Lua, которая является объектно-ориентированной. Мои объекты имеют свойства с геттерами и сеттерами, которые реализуются с метаметодами __index и __newindex соответственно. Проблема в том, что метаметод __index не работает, в то время как __newindex работает нормально. Мой обязательный код:
int L_LED_ctor(lua_State* L){
Board* board = GetInstance<Board>(L, 1, MT_BOARD);
int pin = (int)luaL_checknumber(L, 2);
LED** uData = (LED**)lua_newuserdata(L, sizeof(LED*));
*uData = new LED(board, pin);
luaL_getmetatable(L, MT_LED);
lua_setmetatable(L, -2);
return 1;
}
//getters and setters
extern "C" void RegisterComponent(lua_State* L){
luaL_Reg led[] = {
{"__index", L_LED_Get},
{"__newindex", L_LED_Set},
{"new", L_LED_ctor},
{"Toggle", L_LED_Toggle},
{NULL, NULL}
};luaL_newmetatable(L, MT_LED);
luaL_setfuncs(L, led, 0);
lua_pushvalue(L, -1);
lua_setfield(L, -1, "__index");
lua_setglobal(L, "LED");
}
Теперь, когда я выполняю этот скрипт Lua:
led = LED.new(board, 16)
print(led.__index)
print(led.__newindex)
Я получаю следующий вывод:
table: 0xe7e38
function: 0xb6c27fac
Это означает, что метаметод __index является таблицей, поэтому он не связан с C ++. Что я сделал неправильно в своем коде привязки?
Задача ещё не решена.
Других решений пока нет …