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链接: https://repl.it/@typhirz/LightsalmonDenseCodeview

原文链接 https://stackoverflow.com/questions/52012583

点赞
stackoverflow用户734069
stackoverflow用户734069

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

这两行代码与下面这行代码不同:

the = nil

前两行操作存储在变量list/help中的_表格_。而最后一行只是将变量the赋为nil。存储在list/help中的表也存储在stuff/test表中。

更改变量与更改存储在变量中的表格_不同_。

2018-08-24 23:35:16
stackoverflow用户9906784
stackoverflow用户9906784

Nicol Bolas 在我的大型程序中提供了一些见解,这导致了我解决了问题。我使用了 stuff[1] = {unpack(list)} 而不是 stuff[1] = list,这使它强制创建一个与 list 分离的新表,使我能够稍后操纵 list 而不更改 stuff 中的任何内容。由于这是浅拷贝,它并不适用于所有情况(特别是如果有进一步的嵌套),因此请寻找深拷贝来获得更强大的解决方案。

2018-08-25 00:52:12