2011-08-30 85 views
2

我是Lua/LuaPlus的全新品牌,並試圖弄清metatables是如何工作的。初學者LuaPlus Metatables問題

在從手動拍攝這段代碼:

LuaObject metaTableObj = state->GetGlobals().CreateTable("MultiObjectMetaTable"); 
metaTableObj.SetObject("__index", metaTableObj); 
metaTableObj.RegisterObjectFunctor("Print", &MultiObject::Print); 

在第一行中,我們創建一個新表,但第二行是有點混亂。在我們剛剛創建的這個表中,我們使用鍵__index來設置與表本身相同的元素。爲什麼選擇__index作爲關鍵字,以及爲什麼將表的元素設置爲等於表本身?

然後在代碼的下一節:

MultiObject obj1(10); 
LuaObject obj1Obj = state->BoxPointer(&obj1); 
obj1Obj.SetMetaTable(metaTableObj); 
state->GetGlobals().SetObject("obj1", obj1Obj); 

我們創建了一個C++對象,其地址通過該BoxPointer呼叫LuaObject相關聯,並設置元表,這樣我們就可以使用打印功能。

但是對於最後一行,是否只是創建一個名爲「obj1」的全局Lua變量?此時「obj1」和「MultiObjectMetaTable」將成爲全局Lua變量嗎?

+0

這是從哪裏來的? – Alex

+0

http://luaplus.org/projects/luaplus/repository/revisions/master/changes/Docs/LuaPlus.html 它位於「註冊對象分派函子」部分。 – Thomas

回答

1

這不是標準的Lua,它看起來像你使用的是C++的包裝,我不熟悉,但我可以做一些猜測

在我們創建一個新表的第一行,但第二行是一個有點混淆的 。在我們剛剛創建的這個表中,我們使用等於表本身的鍵__index來設置 元素。爲什麼選擇__index 作爲關鍵字,以及爲什麼將該表的元素設置爲等於 表本身?

__index是使用metatables時的一個特殊鍵。例如,如果我有一個表t,並且我嘗試使用foo的鍵索引它,當然,我會找回與該鍵相關的值。但讓我們說沒有什麼。通常情況下,如果你嘗試索引一個沒有任何東西的地方,你會得到nil

但是,如果你有一個metatable與特殊鍵__index在它!如果你有一個__index功能或表格metatable,它會用它來找到你的價值。如果您在此處爲__index指定了一個表格,它將查看該表格並將該值返回給您提供的密鑰。這可以讓你獲得類似繼承的行爲。即如果表t沒有這個值,則默認爲這個其他表中的值。

But for the last line, is that just creating a global Lua variable called "obj1"? At this point "obj1" and "MultiObjectMetaTable" will be global Lua variables?

正如我所說,這不是標準的Lua,所以我不能完全確定發生了什麼那裏。 (混合使用C++和Lua可能會變得棘手,所以在你還在學習Lua的時候,最好還是堅持使用C接口,這樣你才能理解真正發生的事情,一旦你明白你可以繼續使用更多的自動化解決方案)

+0

感謝您的信息。關於這個__index鍵,它只適用於metatable。換句話說,如果你有一個標準的Lua表,它必須有一個關聯的metatable和__index鍵才能工作。 – Thomas

+0

這是正確的。特殊鍵以'__'開始,如'__index','__newindex','__add'等等,它們只對metatable有意義。 – Alex