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