Пользовательские данные - это собранное мусором значение произвольного размера и содержимого. Вы создаете один из C API, с lua_newuserdata()
, который создает и толкает его в стек и дает вам указатель на его содержимое для инициализации, как вам кажется, от C.
Это очень сопоставимо с вызовом malloc()
. Ключевое отличие от malloc()
состоит в том, что вам никогда не нужно звонить free()
, а вы просто разрешаете последнюю ссылку на него испаряться, и сборщик мусора в конечном итоге восстановит его хранилище.
Они наиболее полезны для хранения данных, полезных с C, но с которыми необходимо управлять из Lua. Они поддерживают отдельные метатеги, которые являются ключевой функцией, позволяющей связывать объекты C или C++ с Lua. Вы просто заполняете его метатебель методами, написанными на C, которые получают доступ, изменяют и/или используют содержимое пользовательских данных, а результатом является объект, доступный из Lua. Хорошим примером этого является io
library, в котором хранятся указатели C FILE *
в пользовательских данных и представлены привязки, которые реализуют знакомые read
, write
и аналогичные методы. Внедряя метаметод __gc
, библиотека io
гарантирует, что один из ее объектов file
закрывает связанные FILE *
при их сборке.
Легкие пользовательские данные - это то, как вы представляете указатель на что-то как значение в Lua. Вы создаете его, вызывая lua_pushlightuserdata()
указателем, являющимся его значением.Они управляются Lua так же, как и число. Они полезны, когда вам нужно называть объект C таким образом, чтобы имя могло быть передано в пределах Lua, но Luna не управляет жизнью объекта. Подобные числа равны, когда они имеют одинаковое значение, легкие пользовательские данные сравниваются равными, если они содержат один и тот же указатель. Как и числа, они существуют до тех пор, пока они находятся в стеке или хранятся в переменной, и у них нет отдельных метаданных, и они не собираются с мусором.
Метатабельный должен быть прикреплен к * something *, userdatum является разумным выбором. – Textmode 2013-08-28 23:49:10