2014-01-26 26 views
4

我在Python中完成了大部分編程,並且我在大多數項目中都使用了OOP實踐。我最近開始看看Love2D遊戲庫和引擎。我設法配置了一些東西,然後考慮製作一個GameObject類。但是,這是什麼? Lua沒有課程!它有表格,metatables和其他類似的東西。即使在多次閱讀文檔後,我仍然遇到很多麻煩。在Lua中實現OOP的意義

請看下面的例子:

catClass = {} 
catClass.__index = catClass 
catClass.type = "Cat" 

function catClass.create(name) 
    local obj = setmetatable({}, catClass) 
    obj.name = name 
    return obj 
end 

cat1 = catClass.create("Fluffy") 
print(cat1.type) 

cat2 = catClass.create("Meowth") 

cat1.type = "Dog" 

print(cat1.type) 
print(cat2.type) 
print(catClass.type) 

這樣做的輸出如下:

Cat 
Dog 
Cat 
Cat 

我不明白的是爲什麼改變cat1.type爲「狗」,不相同cat2和catClass的變化。設置metatable是否創建表的副本? Google沒有提供有用的結果(很少有很好的Lua解釋)。

回答

6

當您索引表並且鍵不存在時,Lua將查看錶是否存在表的metatable。如果有的話,它將使用該元方法的__index鍵來重新索引您的密鑰。

當您創建cat1時,它繼承了catClass metatable。然後,當您索引type時,它會看到cat1沒有名爲type的表條目,因此會查找metatable來查找它。

然後你cat1設置typeDog,只套cat1本身的表項,元表。這就是爲什麼當你索引cat1再次爲type時,你得到Dog而不是Cat

如果你去http://www.lua.org/有Lua編程人員編寫的Lua編程的文檔和一些舊版本。

4

請參閱setmetatable文檔 - 返回的表格是在第一個參數中指定的表格。

對於create(感謝{})的每次調用,這是一個不同的表格,並且每個新表格也不同於所使用的metatable。沒有進行復制,而是創建了一個新的表,該表被「鏈接」到元表。

因此,存在在上述三個不同 - cat1(用mt catClass),cat2(也用mt catClass)和catClass本身。完成後改變cat1,因此對其他兩個表格沒有影響。


參見Lua Metatables Tutorial;使用metatable中提供的__index可以有效地模擬JavaScript的[prototype]分辨率。

當你看到一張桌子用鑰匙,不論關鍵是,和值尚未分配該鍵什麼.. Lua中會查找表中的一個關鍵__index metatable .. 如果__index包含一個表,Lua將查找表中最初使用的關鍵字__index。在特別表只是修改爲正常 -

然而,__index一直沒有對分配一個新的索引表的一個影響。 (如果需要這種直寫行爲,本教程還會繼續解釋__newindex。)