我在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)
Run Code Online (Sandbox Code Playgroud)
输出如下:
Cat
Dog
Cat
Cat
Run Code Online (Sandbox Code Playgroud)
我不明白为什么将cat1.type更改为"Dog"不会导致cat2和catClass发生相同的变化.设置元表是否会创建表的副本?谷歌没有提供有用的结果(很少有很好的Lua解释).
当您索引表并且键不存在时,Lua将查看该表是否存在metatable.如果有,那么它将使用该元方法的__index密钥重新索引您的密钥.
当你创建cat1它时继承了catClassmetatable.然后,当您建立索引时type,它将看到cat1没有调用的表条目type,因此查找metatable以找到它.
然后,设置type上cat1到Dog,这只是设置的表密钥cat1本身,不是元表.这就是为什么当你cat1再次索引type你得到Dog而不是Cat.
如果你去http://www.lua.org/,那里有Lua编写的文档和Lua编程的一些旧版本.