我的大部分编程都是用 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 将查看该表是否存在元表。如果有,那么它将使用 __index
该元方法的键来重新索引您的键。
创建时 cat1
它继承了 catClass
元表。然后当你索引 type
它会看到 cat1
没有名为 type
的表条目从而查找元表以找到它。
然后你设置 type
在 cat1
至 Dog
, 只设置 cat1
的表键本身,不是 元表。这就是为什么当您索引 cat1
时再次为 type
你得到 Dog
而不是 Cat
.
如果你去http://www.lua.org/有 Lua 编程的文档和一些较旧的副本,由 Lua 本身的作者编写。
关于oop - 在 Lua 中理解 OOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359817/