我有这样的事情: (它实际上是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对象公开为userdata并将get get和set插入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
来完成此操作。但是,进行此更改将破坏向后兼容性。
有没有简单的方法可以同时使用这两种语法?
答案 0 :(得分:6)
只要您保留get
和set
功能,两种方法都可以使用。
如果您的对象是常规Lua表,则只会为不存在的键调用__index
和__newindex
。
如果您的对象(如更新中所述)是用户数据,您可以自己模拟此行为。在__index
中,如果密钥为"get"
或"set"
,则返回适当的函数。