варианты использования для легких userdata в lua? - PullRequest
2 голосов
/ 30 марта 2012

Я использую userdata для передачи метатаблиц в Lua и вызова c ++. Мне интересно, могут ли легкие пользовательские данные помочь мне с несколькими проблемными случаями, которые у меня есть.

Легкие пользовательские данные - это пустота *, но вы ничего не можете с этим сделать в lua, по крайней мере, в моем понимании, вы можете просто как-то передать их и вернуться к C - вызовом функции?

Как вы используете легкие пользовательские данные? Если у кого-то есть варианты использования, они использовали их, потому что это помогло бы мне разобраться с ними.

ТИА

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Я думаю Программирование на 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);
1 голос
/ 31 марта 2012

Типичный вариант использования - это когда вы встраиваете lua в другое приложение и хотите предоставить токены авторов lua (в виде легких пользовательских данных), которые они могут передать в настроенный вами API.Вот конкретный пример.

Скажем, вы предоставили следующий API в lua для людей и друзей:

Они предоставят вам доступ к объектам "друзей" через ваши привязки

GetPersonCount() // returns a number
GetPerson(index) // returns a light user data - a pointer to the C++ version

Они будут принимать возвращаемое значение GetPerson (или GetFriend ниже) в качестве аргумента.

GetFirstName(person)
GetLastName(person)
GetFriendCount(person)
GetFriend(person, index) // would also return user data like GetPerson

Это было бы полезно, если вы уже создали программу на C ++ для получения информации о друзьях, но выхочу сделать его доступным для людей, пишущих сценарии на языке lua, через более простой и ограниченный интерфейс, к которому можно безопасно обращаться во время выполнения, не требуя компиляции или вашего исходного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...