Я рекомендую вернуть пользовательские данные. Независимо от подхода, где-то должен быть указатель
к данным C ++, или самим данным C ++, и некуда
безопасно делать это со столом.
Возвращение таблиц имеет смысл в некоторых ситуациях, потому что они могут
быть «аннотированным» в Lua с дополнительными атрибутами без необходимости делать
ничего лишнего, чтобы поддержать это. К сожалению, указатель на объект C ++
должен идти куда-то, и некуда идти другим
чем фактическая запись в самой таблице.
Это не очень безопасное место для этого. Может быть найден Луа
код и удален или заменен. Это может быть случайно или по
цель, это не имеет значения.
Поэтому я предпочитаю возвращать объекты пользовательских данных. Они могут быть
заставить работать как таблицы, если действительно нужно на этом настаивать, но они
также есть «секретная» область (сами данные пользователя), где C ++
указатель объекта может быть сохранен, защищен от перезаписи кодом Lua.
(объекты Userdata также имеют указатель «environment», который является еще одним
место для хранения данных, специфичных для объекта. Как с полезной нагрузкой userdata
само по себе это значение недоступно для кода Lua и не может быть повреждено
таким образом.)