在 OOP 和数据结构中,像对象一样,表具有 STATE 而表是不止一种意义上的对象,我们实际上是什么意思?

What do we actually mean by like objects,tables have a STATE and tables are objects in more than one sense programming in OOP and data structures?

我一直在学习 roblox lua 语言,很多次我遇到了一种叫做 table 的东西,它有一个像对象线一样的状态,我真的不明白,因为我不如何形象化它,就像它实际意味着什么

我一直在阅读这篇 roblox lua 文章并再次遇到这一行:面向对象编程(https://developer.roblox.com/en-us/articles/Object-Oriented-Programming)

这是那篇文章的一部分,其中包含那行:

As Lua supports duck typing through the use of Metatables, the ability to create “objects” can be achieved. This is essentially objected-oriented programming. A Tables in Lua is an object in more than one sense. Like objects, tables have a state. Like objects, tables have an identity that is independent of their values; specifically, two objects (tables) with the same value are different objects, whereas an object can have different values at different times, but it is always the same object. Like objects, tables have a life cycle that is independent of who created them or where they were created.

有人可以帮我解决这个问题吗?我一直在尝试在 google 上搜索这个,但没有类似的东西出现,比如它实际上是什么?还有我们所说的 table 作为对象是什么意思?

考虑 tables 的一种简单方法是它们是字典或关联数组。它们也可以像常规数组和列表一样工作。但在幕后,它们将值存储在键值对系统中。

考虑到这一点,让我们将该段落分解成每一行来讨论它的含义。

1) 由于 Lua 通过使用 Metatable 支持 duck typing,因此可以实现创建“对象”的能力。这本质上是面向对象编程。

这意味着如果一个物体像鸭子一样走路并且像鸭子一样嘎嘎叫,那么可以合理地预期它是一只鸭子。 Lua 在技术上没有 OOP classes,但我们可以让 lua tables 像 OOP classes 一样走路和嘎嘎叫。

当您用其他编程语言创建 class 的实例时,该实例具有该 class 类型的所有属性、函数和字段。在 lua 中,我们可以通过 metamethods.

让 table 假装这样做
local TestClass = {}
TestClass.__index = TestClass

function TestClass.new()
    local tc = {
        secret = "hello world"
    }
    setmetatable(tc, TestClass)

    return tc
end
function TestClass:printSomething()
    print(self.secret)
end


-- construct a new "object" of TestClass, and call one of its functions
local a = TestClass.new()
a:printSomething()

这里发生的是 TestClass 正在覆盖它的 __index 元方法。这意味着当 table 试图在它的 table 中查找一个键时,而不是从它自己的 table 中查找索引,它将使用 table 的索引测试类。 new() 函数创建一个全新的 table,然后用 TestClass 覆盖它的元 table,确保新的 table 的行为与原始 TestClass 对象一样。

因此,即使 tc 对象没有明确定义的 new()printSomething() 函数,调用该对象上的函数仍然有效。这就是 lua 伪装成面向对象的方式。

2) Lua 中的一个 table 在不止一种意义上是一个对象。像对象一样,tables 有一个状态。

这只是意味着您可以像容器一样将东西存储在 table 中。

local a = {
    foo = 5
}

print(a.foo) -- 5

3) 像对象一样,tables 有一个独立于它们的值的标识;具体来说,具有相同值的两个对象(tables)是不同的对象...

local a = {}
local b = {}

print(a == b) -- false
print(a == {}) -- also false

4) 虽然一个对象在不同的​​时间可以有不同的值,但它始终是同一个对象。

local a = {
    foo = 5
}
print(a) -- some table pointer id
a.foo = 10
print(a) -- still the same table pointer

5) 与对象一样,tables 的生命周期与创建它们的人或创建位置无关。

Lua tables are kept alive in memory based on how many objects have reference to them。这意味着它们的对象生命周期可以存在于它们的原始范围之外。

local function createTable()
    -- make a local table to this function
    local a = {}

    -- make a table to return to the program
    local b = {
        c = a
    }
    print("a = ", a) -- some table pointer
    print("b = ", b) -- some other table pointer
    return b
end

-- a is no longer in scope, and in other languages would be cleaned up
-- but since b holds a reference to it, it is not removed.
local d = createTable()
print("d =", d)  -- should print out b's table pointer
print("d.c = ", d.c) -- should print out a's table pointer

希望这能消除一些困惑。