Привязки Lua: таблица против userdata - PullRequest
3 голосов
/ 16 сентября 2009

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

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

1 Ответ

6 голосов
/ 17 сентября 2009

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

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

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

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

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

...