Я думаю Программирование на Lua объясняет это довольно хорошо:
Реальное использование легких пользовательских данных происходит от равенства. Поскольку полные пользовательские данные являются объектом, они равны только себе. Легкие пользовательские данные, с другой стороны, представляют значение указателя C. Как таковой, он равен любым пользовательским данным, которые представляют один и тот же указатель. Следовательно, мы можем использовать легкие пользовательские данные для поиска объектов C внутри Lua.
В качестве типичного примера, предположим, что мы реализуем связь между
Lua и оконная система. В этой привязке мы используем полные данные пользователя для
представлять окна. (Каждый userdatum может содержать все окно
структура или только указатель на окно, созданное системой.) Когда
есть событие внутри окна (например, щелчок мышью), система
вызывает определенный обратный вызов, идентифицируя окно по его адресу. к
передать обратный вызов Lua, мы должны найти userdata, который представляет
данное окно. Чтобы найти эти пользовательские данные, мы можем хранить таблицу, в которой
индексы - легкие userdata с адресами окна и значениями
полные пользовательские данные, которые представляют окна в Lua. Как только мы имеем
адрес окна, мы помещаем его в стек API как легкие пользовательские данные
и использовать данные пользователя в качестве индекса в этой таблице. (Обратите внимание, что таблица
должны иметь слабые значения. В противном случае эти полные пользовательские данные никогда не будут
собраны.)
На странице также объясняется, что легкие пользовательские данные не являются сборщиком мусора, поэтому управление памятью должно выполняться вашим кодом. Мне кажется, что варианты использования на самом деле довольно ограничены, поэтому, вероятно, вы не можете найти много примеров. Я нашел один пример :
У меня есть подпрограмма, которая создает объект графического интерфейса (древовидное представление) из lua
Таблица. Затем у меня есть отдельная таблица lua, индексируемая дескриптором окна
каждого узла дерева, в качестве lightuserdata. Это упрощает c / lua
интерфейс - я могу использовать дескриптор c для поиска соответствующей таблицы lua
объект.
// save a window handle
lua_pushlightuserdata(L, hKey);
lua_pushvalue(L,filt); // copy of filter table entry
lua_settable(L, treeindex);
// find data for a window handle
lua_pushstring(L, "__treeitems");
lua_gettable(L, LUA_GLOBALSINDEX);
lua_pushlightuserdata(L, hKey);
lua_gettable(L, -2);