簡體   English   中英

理解Lua中的OOP

[英]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以查找它。

然后,設置typecat1Dog ,只設置的表密鑰cat1本身,而不是元表。 這就是為什么當你指數cat1再次typeDog ,而不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM