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