【问题标题】:Making sense of OOP in Lua在 Lua 中理解 OOP
【发布时间】:2014-01-27 15:43:43
【问题描述】:

我的大部分编程都是在 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 解释)。

【问题讨论】:

    标签: oop lua


    【解决方案1】:

    当你索引一个表并且一个键不存在时,Lua 会查看表是否存在一个元表。如果这样做,那么它将使用该元方法的 __index 键来重新索引您的键。

    当您创建 cat1 时,它继承了 catClass 元表。然后,当您索引type 时,它会看到cat1 没有名为type 的表条目,因此会查找元表来找到它。

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

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

    【讨论】:

      【解决方案2】:

      请参阅setmetatable 文档 - 返回的表是第一个参数中指定的表。

      对于create 的每次调用(感谢{}),这是一个不同的表,并且每个新表也与使用的元表不同。没有复制,而是创建了一个 new 表,然后将其“链接”1 到元表。

      因此,上面有三个不同的表 - cat1(带有 mt catClass)、cat2(也带有 mt catClass)和 catClass 本身。更改cat1,因为已经完成,因此对其他两个表没有影响。


      1Lua Metatables Tutorial;使用元表中的__index 有效地模拟了 JavaScript 的 [prototype] 解析。

      当您使用键查找表时,无论键是什么,并且尚未为该键分配值 .. Lua 会查找对于表的元表中的__index 键.. 如果__index 包含一个表,Lua 将查找最初在属于__index 的表中使用的键。

      但是,__index为其中一个表分配新索引没有影响 - 特定 表只是正常修改。 (如果需要这种直写行为,本教程还会继续解释 __newindex。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-19
        • 1970-01-01
        • 1970-01-01
        • 2019-12-11
        • 2017-06-09
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多