C& lua metatable用于面向对象的访问

时间:2011-04-27 05:43:13

标签: c lua

我有这样的事情: (它实际上是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来完成此操作。但是,进行此更改将破坏向后兼容性。

有没有简单的方法可以同时使用这两种语法?

1 个答案:

答案 0 :(得分:6)

只要您保留getset功能,两种方法都可以使用。

如果您的对象是常规Lua表,则只会为不存在的键调用__index__newindex

如果您的对象(如更新中所述)是用户数据,您可以自己模拟此行为。在__index中,如果密钥为"get""set",则返回适当的函数。