Lua表的工作原理

Lua表的工作原理,lua,Lua,我开始从Lua编程学习Lua(第二版) 我不明白书中的下列内容。解释得很模糊 a、 )w={x=0,y=0,label=“console”} b、 )x={math.sin(0)、math.sin(1)、math.sin(2)} c、 )w[1]=“另一个字段” d、 )x.f=w e、 )打印(w[“x”]) f、 )print(w[1]) g、 )打印x.f[1] 当我在a之后打印(w[1])时,为什么它不打印x=0 c.)做什么 e.)和打印(w.x)之间有什么区别 b.)和g.)的作用是

我开始从Lua编程学习Lua(第二版) 我不明白书中的下列内容。解释得很模糊

a、 )
w={x=0,y=0,label=“console”}

b、 )
x={math.sin(0)、math.sin(1)、math.sin(2)}

c、 )
w[1]=“另一个字段”

d、 )
x.f=w

e、 )
打印(w[“x”])

f、 )
print(w[1])

g、 )
打印x.f[1]

当我在a之后打印(w[1])时,为什么它不打印
x=0

c.)做什么

e.)和
打印(w.x)
之间有什么区别


b.)和g.)的作用是什么?

你必须意识到:

t = {3, 4, "eggplant"}
与此相同:

t = {}
t[1] = 3
t[2] = 4
t[3] = "eggplant"
t = {}
t["x"] = 0
t["y"] = 2
而且:

t = {x = 0, y = 2}
与此相同:

t = {}
t[1] = 3
t[2] = 4
t[3] = "eggplant"
t = {}
t["x"] = 0
t["y"] = 2
或者这个:

t = {}
t.x = 0
t.y = 2
在Lua中,表不仅仅是列表,它们也是

当您打印
w[1]
时,真正重要的是第c行。)事实上,
w[1]
在第c行之前根本没有定义

e.)和
打印(w.x)
之间没有区别

b、 )创建名为
x
的新表,该表与
w
分开

d、 )在
x
的内部放置对
w
的引用。(注意:它实际上不是
w
的副本,只是一个。如果您曾经使用过指针,它是类似的。)


g、 )可分为两部分。首先,我们得到
x.f
,这只是引用
w
的另一种方式,因为第d行)。然后我们查找该表的第一个元素,它是
“另一个字段”
,因为第c行。)

有另一种方法在内嵌表声明中创建键

x = {["1st key has spaces!"] = 1}
这里的优点是,您可以使用带有空格和任何扩展ASCII字符的键。 事实上,关键点可以是任何东西,甚至是一个实例对象

function Example()
    --example function
end
x = {[Example] = "A function."}
任何变量、值或数据都可以放在方括号中用作键。价值也是如此。 实际上,这可以替代python中的
关键字中的
,因为您可以通过值对表进行索引以检查它们是否存在


在表的未定义部分获取值不会导致错误。它只会给你零分。使用未定义的变量也是如此。

非常感谢您的解释。这真的帮助我理解了。不过,我有一个简短的问题。。当我这样做时,x.f=w意味着我有类似x={f=w}的东西,我正试图打印x.f。因为f=w和w={“另一个字段”,x=0,y=0,label=“console”},所以x={f={“另一个字段”,x=0,y=0,label=“console”}。我做得对吗?如果是,是否应该打印(x.f.标签)并将控制台作为输出?是的,这完全正确。请记住,
x.f
实际上指的是与
w
相同的物理RAM,因此如果您修改
x.f
中的值,修改将显示在
w
中。但是,如果将
x.f
替换为另一个值(例如不同的表),
w
将不再受影响。顺便说一句,没有打印语句,只有打印功能。