Lua在调用其长度时是否会对嵌套表的值进行不同的计算?

时间:2018-08-24 22:50:32

标签: lua

首先,我使用的是repl.it而不是在桌面上安装Lua。这可能是问题所在,但我不确定,因为我无法轻松访问其他Lua解释器。

我在使用较大的程序时遇到问题,但是在以下代码段中看到了相同的问题:

stuff = {}
list = {"hello"}
table.insert(stuff,list)
table.remove(list)
print(unpack(stuff[1]))

运行时,我希望它能打印出stuff[1]处的解压缩表,该表应该为"hello",因为这是我设置时list的值。使用下面介绍的首选插入和删除方法,可以得到相同的结果。

test = {}
help = {"hello"}
test[#test+1] = help
help[#help] = nil
print(unpack(test[1]))

但是,如果我不调用长度,而是使用幻数或常数,则可以正常工作,如下面的两个示例所示。

what = {}
the = {"hello"}
what[1] = the
the = nil
print(unpack(what[1]))

how = {}
questionmark = {"hello"}
one = 1
what[one] = questionmark
questionmark = nil
print(unpack(what[one]))

最后,当不使用嵌套表时,此示例将不显示该内容,

notnested = {}
nottable = "hello"
notnested[#notnested+1] = nottable
nottable = nil
print(notnested[1])

这是怎么回事?我是误解了声明的时间,做错了还是repl.it/Lua有错?

这是上面五个示例的代表:https://repl.it/@typhirz/LightsalmonDenseCodeview

2 个答案:

答案 0 :(得分:0)

table.remove(list)
help[#help] = nil

这些与此不同:

the = nil

前两个操作存储在变量list / help中的。第二个变量只是将变量 the设为nil。存储在list / help中的表也已经存储在表stuff / test中。

对变量的更改不同于对变量中存储的表的更改。

答案 1 :(得分:0)

下面的Nicol Bolas提供了一些见解,使我在更大的程序中找到了解决方案。我使用stuff[1] = list而不是stuff[1] = {unpack(list)}来迫使它创建一个与list分开的新表,这使我以后可以操作list而不更改{{ 1}}。由于这是一个浅表副本,因此并非在所有情况下都有效(特别是在存在更多嵌套的情况下),因此请查看深表副本以寻求更可靠的解决方案。