Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / lua lightuserdata

lua lightuserdata

Поделиться
MrGobusПользовательwww10 ноя. 201723:05#0
Есть пара функций, создают метатаблицу и глобальную переменную на ее основе
void initDialog() {
  const luaL_Reg reg[] = {
    {"__index", dialog___index},
    {"__newindex", dialog___newindex},
    {NULL, NULL}
  };
  lua_newlightuserdata(L, NULL);
  luaL_newmetatable(L, "Dialog");
  luaL_setfuncs(L, reg, 0);
  lua_setmetatable(L, -2);  
  lua_setglobal(L, "dialog");
}
void initBackground() {
  const luaL_Reg reg[] = {
    {"__index", background___index},
    {"__newindex", background___newindex},
    {NULL, NULL}
  };
  lua_newlightuserdata(L, NULL);
  luaL_newmetatable(L, "Background");
  luaL_setfuncs(L, reg, 0);
  lua_setmetatable(L, -2);  
  lua_setglobal(L, "background");
}

Все хорошо, но вызов второй функции блокирует вызовы методов __index, __newindex предыдущей созданной lua переменной
Изменение порядка вызова функций всегда приводит к блокировки результат работы предыдущей

Меняю lua_newlightuserdata(L, NULL) на lua_newuserdata(L, 1) все начинает работать

Как так?
Искренне верю что light user data это переменная хранящая указатель, а lua_newlightuserdata(L, NULL) это аналог lua_newuserdata(L, sizeof(*void))

Если кто понимает, поясните.

Правка: 10 ноя. 2017 23:06

WraithПостоялецwww11 ноя. 20174:09#1
Lightuserdata - это простой тип наподобие Number, только хранит поинтер. GC не подлежит.
Метатаблицы для них определять нельзя...

... ну на самом деле можно, но это будет одна для всех значений этого типа.

loysoПостоялецwww11 ноя. 20174:19#2
Метатаблицы работают только для full userdata.
Ты бы версию Lua писал - они очень разные.
lua_newlightuserdata - нет ни в одной стандартной Lua.
И где только такую каку нашел!
WraithПостоялецwww11 ноя. 20175:20#3
loyso
> Метатаблицы работают только для full userdata.
Метатаблицы работают для всех типов. Даже для строк. Только для базовых типов они глобальные, т.е. по одной на каждый тип.
loysoПостоялецwww11 ноя. 20176:31#4
Wraith
Ага. Я забыл уже.
Из 2.4:
Tables and full userdata have individual metatables (although multiple tables and userdata can share their metatables). Values of all other types share one single metatable per type; that is, there is one single metatable for all numbers, one for all strings, etc. By default, a value has no metatable, but the string library sets a metatable for the string type
MrGobusПользовательwww11 ноя. 20177:19#5
loyso
> Ты бы версию Lua писал - они очень разные.
5.3

Wraith
> но это будет одна для всех значений этого типа.
Угу, ясненько, спасибо

loyso
> И где только такую каку нашел!
http://lua.org.ru/manual_ru.html#luaL_setfuncs

/ Форум / Программирование игр / Общее

2001—2017 © GameDev.ru — Разработка игр