2011-04-27 67 views
1

我有這樣的事情: (它實際上是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。但是,進行此更改將會破壞向後兼容性。

有什麼簡單的方法可以同時使用兩種語法嗎?

回答

6

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

如果你的對象是一個普通的Lua表,那麼__index__newindex將僅被稱爲不存在的鍵。

如果你的對象(如您在更新狀態)的用戶數據,你可以自己模擬這種行爲。在__index,如果關鍵是"get""set",返回相應的功能。

+0

感謝,但對我來說Blob.new()創建一個新的用戶數據對象,而不是表,獲取和設置在用戶數據的元表會。我會更新這個問題以明確這一點。 – 2011-04-27 06:58:54

+0

我已經更新了我的答案以涵蓋該內容。 – 2011-04-27 07:39:51