Oop 在面向对象编程和数据结构中,我们所说的“类似对象”、“表有状态”和“表是不止一种意义上的对象”到底是什么意思?
我一直在学习roblox lua语言,很多次我遇到一种叫做table的东西,它有一个类似于对象线的状态,我真的不明白这一点,因为我不知道如何形象化它,比如它实际上意味着什么 我一直在阅读roblox lua的这篇文章,并且再次遇到了这一行:面向对象编程() 这是那篇文章的一部分,其中包含以下内容: 由于Lua通过使用元表支持duck类型,因此可以实现创建“对象”的能力。这本质上是面向对象的编程。Lua中的表在多种意义上都是对象。与对象一样,表也有状态。与对象一样,表具有独立于其值的标识;具体来说,具有相同值的两个对象(表)是不同的对象,而一个对象可以在不同的时间具有不同的值,但它始终是同一个对象。与对象一样,表的生命周期与创建它们的人或创建位置无关Oop 在面向对象编程和数据结构中,我们所说的“类似对象”、“表有状态”和“表是不止一种意义上的对象”到底是什么意思?,oop,data-structures,lua,roblox,Oop,Data Structures,Lua,Roblox,我一直在学习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
希望这能消除一些混淆。表是一个容器:它可以有内部成员(数据字段和函数),这些成员可以在不更改容器的情况下进行更改。依我看,这是一个叫做“国家”的表格的内容。