Привязки Lua: таблица против userdata
При создании привязок Lua для классов C++ я должен возвращать таблицы или объекты пользовательских данных?
Кто-нибудь знает какие-либо плюсы и минусы для каждого метода?
1 ответ
Я рекомендую вернуть пользовательские данные. Независимо от подхода, где-то должен быть указатель на данные C++ или сами данные C++, и с таблицей нигде не безопасно это сделать.
Возвращение таблиц имеет смысл в некоторых ситуациях, потому что они могут быть "аннотированы" в Lua с помощью дополнительных атрибутов без необходимости делать что-либо дополнительное для поддержки этого. К сожалению, указатель на объект C++ должен куда-то идти, и ему некуда идти, кроме реальной записи в самой таблице.
Это не очень безопасное место для этого. Его можно найти по коду Lua, удалить или заменить. Это может быть случайно или нарочно, это не имеет значения.
Поэтому я предпочитаю возвращать объекты пользовательских данных. Их можно заставить работать как таблицы, если действительно нужно на этом настаивать, но у них также есть "секретная" область (сами данные пользователя), где может храниться указатель объекта C++, защищенный от перезаписи кодом Lua.
(Объекты пользовательских данных также имеют указатель "окружения", который является другим местом для хранения данных, специфичных для объекта. Как и в случае с самой полезной нагрузкой пользовательских данных, это значение недоступно для кода Lua и не может быть повреждено таким образом.)