2015-02-08 60 views
3

我在C中創建了一個userobject,並且作爲它的一部分,我創建了一個metatable來覆蓋像__tostring,__index等方法。但我注意到,可以通過getmetatable()檢索對象的metatable。如果我的metatable有一個__metatable鍵,似乎可以讓getmetatable()返回任意表。我想getmetatable()返回nil,所以我首先想到的是添加__metatable鍵與nil,但是這顯然是行不通的,因爲它實際上並沒有添加__metatable關鍵的元表:lua:我如何讓getmetatable()返回零?

struct my_obj* obj = (struct my_obj*)lua_newuserdata(L, sizeof(struct my_obj)); 
if (luaL_newmetatable(L, "mymetatable") != 0) { 
    lua_pushliteral(L, "__metatable"); 
    lua_pushnil(L); 
    lua_rawset(L, -3); /* will not work, can not add a nil... */ 
} 
lua_setmetatable(L, -2); 

這可以以某種方式完成,或者我必須堅持填寫一個空的表格到__metatable

+0

'{__metatable = false}'是否足夠接近? – greatwolf 2015-02-09 10:07:03

回答

0

好問題。

鑑於所涉及的手冊和代碼的快速查看,我沒有看到在lua(5.1,5.2或5.3)中使用此方法的任何方法。

我想知道是否有一些__call /等。遊戲你可以發揮作用,但查找是原始的,除了「沒有」之外沒有做太多檢查。

1

重新定義getmetatable返回nil,如果該表具有__metatable鍵。