C&LUA元表的面向对象访问

问题描述:

我有这样的事情: (它实际上是C++,但在这个简单的形式没有什么特定的C++),则它C&LUA元表的面向对象访问

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对象为用户数据和插件get和set可到元表,用这个我能做到:

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__newindexblob_set_value_lua。但是,进行此更改将会破坏向后兼容性。

有什么简单的方法可以同时使用两种语法吗?

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

如果你的对象是一个普通的Lua表,那么__index__newindex将仅被称为不存在的键。

如果你的对象(如您在更新状态)的用户数据,你可以自己模拟这种行为。在__index,如果关键是"get""set",返回相应的功能。

+0

感谢,但对我来说Blob.new()创建一个新的用户数据对象,而不是表,获取和设置在用户数据的元表会。我会更新这个问题以明确这一点。 – 2011-04-27 06:58:54

+0

我已经更新了我的答案以涵盖该内容。 – 2011-04-27 07:39:51