C & lua метатабельный для объектно-ориентированного доступа - PullRequest
1 голос
/ 27 апреля 2011

У меня есть что-то вроде этого: (Это на самом деле C ++, но в этой упрощенной форме нет ничего специфичного для C ++)

struct Blob;

// Some key-value accessors on Blob
char * blob_get_value( Blob * b, char * key );
void set_value( Blob * b, char * key, char * value); 


//Some lua wrappers for these functions
int blob_get_value_lua( lua_State * L );
int blob_set_value_lua( lua_State * L );

Я делаю их доступными синтаксически чистым способом.В настоящее время я выставляю объект Blob как пользовательские данные, а плагин получает и устанавливает в metatable, используя это, я могу сделать:

blob = Blob.new()
blob:set("greeting","hello")
print( blob:get("greeting") )

Но я бы предпочел

blob = Blob.new()
blob.greeting = hello
print( blob.greeting )

Я знаю этоэто можно сделать, установив __index на blob_get_value_lua и __newindex на blob_set_value_lua.Однако внесение этого изменения нарушит обратную совместимость.

Есть ли простой способ иметь оба синтаксиса одновременно?

1 Ответ

6 голосов
/ 27 апреля 2011

Пока вы сохраните функции get и set, оба подхода будут работать.

Если ваш объект - обычная таблица Lua, то и __index, и __newindex будут вызываться только для несуществующих ключей.

Если ваш объект (как вы указали в обновлении)это пользовательские данные, вы можете смоделировать это поведение самостоятельно.В __index, если клавиша "get" или "set", возвращает соответствующую функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...