Oop 在面向对象编程和数据结构中,我们所说的“类似对象”、“表有状态”和“表是不止一种意义上的对象”到底是什么意思?

Oop 在面向对象编程和数据结构中,我们所说的“类似对象”、“表有状态”和“表是不止一种意义上的对象”到底是什么意思?,oop,data-structures,lua,roblox,Oop,Data Structures,Lua,Roblox,我一直在学习roblox lua语言,很多次我遇到一种叫做table的东西,它有一个类似于对象线的状态,我真的不明白这一点,因为我不知道如何形象化它,比如它实际上意味着什么 我一直在阅读roblox lua的这篇文章,并且再次遇到了这一行:面向对象编程() 这是那篇文章的一部分,其中包含以下内容: 由于Lua通过使用元表支持duck类型,因此可以实现创建“对象”的能力。这本质上是面向对象的编程。Lua中的表在多种意义上都是对象。与对象一样,表也有状态。与对象一样,表具有独立于其值的标识;具体来说

我一直在学习roblox lua语言,很多次我遇到一种叫做table的东西,它有一个类似于对象线的状态,我真的不明白这一点,因为我不知道如何形象化它,比如它实际上意味着什么

我一直在阅读roblox lua的这篇文章,并且再次遇到了这一行:面向对象编程()

这是那篇文章的一部分,其中包含以下内容:

由于Lua通过使用元表支持duck类型,因此可以实现创建“对象”的能力。这本质上是面向对象的编程。Lua中的表在多种意义上都是对象。与对象一样,表也有状态。与对象一样,表具有独立于其值的标识;具体来说,具有相同值的两个对象(表)是不同的对象,而一个对象可以在不同的时间具有不同的值,但它始终是同一个对象。与对象一样,表的生命周期与创建它们的人或创建位置无关


有人能帮我一下吗?我一直在谷歌上搜索,但没有找到类似的东西,比如它到底是什么?我们把表当作对象是什么意思?

一个简单的方式来思考表,就是它们是字典或关联数组。它们也可以像常规数组和列表一样工作。但在引擎盖下,它们将值存储在一个键值对系统中

记住这一点,让我们把这一段分成每一行,谈谈它的意思

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

local a = {
    foo = 5
}
print(a) -- some table pointer id
a.foo = 10
print(a) -- still the same table pointer
这意味着,如果一个物体像鸭子一样走路,像鸭子一样嘎嘎叫,那么可以合理地预期它是鸭子。Lua在技术上没有OOP类,但我们可以让Lua表像OOP类一样行走和嘎嘎作响

使用其他编程语言创建类的实例时,该实例具有该类类型的所有属性、函数和字段。在lua中,我们可以让桌子假装这样做

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

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

2) Lua中的表是一个不止一种意义上的对象。与对象一样,表也有状态。

local a = {
    foo = 5
}
print(a) -- some table pointer id
a.foo = 10
print(a) -- still the same table pointer
这仅仅意味着您可以像容器一样在表中存储东西

local a = {
    foo = 5
}

print(a.foo) -- 5
3) 与对象类似,表具有独立于其值的标识;具体来说,具有相同值的两个对象(表)是不同的对象

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) 与对象一样,表的生命周期与创建它们的人或创建位置无关。

local a = {
    foo = 5
}
print(a) -- some table pointer id
a.foo = 10
print(a) -- still the same table pointer
。这意味着它们的对象生命周期可以存在于其原始范围之外

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

希望这能消除一些混淆。

表是一个容器:它可以有内部成员(数据字段和函数),这些成员可以在不更改容器的情况下进行更改。依我看,这是一个叫做“国家”的表格的内容。