oop - 在 Lua 中理解 OOP

标签 oop 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 将查看该表是否存在元表。如果有,那么它将使用 __index该元方法的键来重新索引您的键。

创建时 cat1它继承了 catClass元表。然后当你索引 type它会看到 cat1没有名为 type 的表条目从而查找元表以找到它。

然后你设置 typecat1Dog , 只设置 cat1 的表键本身,不是 元表。这就是为什么当您索引 cat1 时再次为 type你得到 Dog而不是 Cat .

如果你去http://www.lua.org/有 Lua 编程的文档和一些较旧的副本,由 Lua 本身的作者编写。

关于oop - 在 Lua 中理解 OOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359817/

相关文章:

java - 实例初始化器的用例

c - 脚本和主机应用程序之间的责任

Lua string.gsub 里面的 string.gmatch?

lua - Lua 中的 OOP 和事件监听器 (Corona SDK)

java - 如何将自引用传递给 java 中的构造函数?

java - 如何从父类(super class)继承接口(interface)

c++ - 我如何使用 C++ STL Sort 对具有继承的对象数组进行排序

C++ - 过度使用虚拟方法?

syntax - Lua:如何执行从参数传递的回调?

lua - 垃圾收集和字符串到字符串函数的内存