[英]Making sense of OOP in Lua
我在Python中編寫了大部分編程,並且在大多數項目中使用OOP實踐。 我最近開始看看Love2D游戲庫和引擎。 我設法配置了一些東西,然后考慮制作一個GameObject類。 但是,這是什么? Lua沒有課程! 它有表格,元表和其他類似的東西。 即使在多次閱讀文檔后,我仍然遇到很多麻煩。
請考慮以下示例:
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更改為“Dog”不會導致cat2和catClass發生相同的變化。 設置元表是否會創建表的副本? 谷歌沒有提供有用的結果(很少有很好的Lua解釋)。
當您索引表並且鍵不存在時,Lua將查看該表是否存在metatable。 如果有,那么它將使用該元方法的__index
鍵重新索引您的密鑰。
當你創建cat1
它繼承了catClass
metatable。 然后,當您索引type
,它將看到cat1
沒有名為type
的表條目,因此查找metatable以查找它。
然后,設置type
上cat1
到Dog
,只設置的表密鑰cat1
本身,而不是元表。 這就是為什么當你指數cat1
再次type
你Dog
,而不是Cat
。
如果你去http://www.lua.org/,那里有Lua編寫的文檔和Lua編程的一些舊版本。
請參閱setmetatable
文檔 - 返回的表是第一個參數中指定的表。
對於create
每次調用,這是一個不同的表(感謝{}
),每個新表也與使用的元表不同。 沒有復制,而是創建了一個新表,然后將其“鏈接” 1到metatable。
因此,上面有三個不同的表 - cat1
(使用mt catClass), cat2
(也使用mt catClass)和catClass
本身。 改變cat1
,就像完成一樣,因此對其他兩個表沒有影響。
1參見Lua Metatables教程 ; 使用metatable中提供的__index
有效地模擬了JavaScript的[原型]分辨率。
當您使用鍵查找表時 ,無論鍵是什么, 並且沒有為該鍵分配值 .Lua將在表的metatable中查找
__index
鍵。 如果__index
包含表,Lua將查找最初在屬於__index
的表中使用的密鑰。
但是, __index
index對於為其中一個表分配新索引沒有任何影響 - 特定表只是正常修改。 (如果需要這樣的直寫行為,本教程還會繼續解釋__newindex
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.