Вопрос

При создании привязок Lua для классов C ++ я должен возвращать таблицы или объекты пользовательских данных?

Кто-нибудь знает плюсы и минусы каждого метода?

Это было полезно?

Решение

Я рекомендую вернуть пользовательские данные. Независимо от подхода, где-то должен быть указатель к данным C ++, или самим данным C ++, и некуда безопасно сделать это с таблицей.

В некоторых ситуациях возврат таблиц имеет смысл, поскольку они могут быть «аннотированным» в Lua с дополнительными атрибутами без необходимости делать ничего лишнего, чтобы поддержать это. К сожалению, указатель на объект C ++ должен идти куда-то, и некуда идти другим чем фактическая запись в самой таблице.

Это не очень безопасное место для этого. Может быть найден Луа код и удален или заменен. Это может быть случайно или по цель, это не имеет значения.

Поэтому я предпочитаю возвращать объекты пользовательских данных. Они могут быть заставить работать как таблицы, если действительно нужно на этом настаивать, но они также есть «секрет» область (собственно пользовательские данные), где C ++ указатель объекта может быть сохранен, защищен от перезаписи кодом Lua.

(Объекты пользовательских данных также имеют указатель «окружения», который является еще одним место для хранения данных, специфичных для объекта. Как с полезной нагрузкой userdata само по себе это значение недоступно для кода Lua и не может быть повреждено таким образом.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top