首先,我使用的是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
答案 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}}。由于这是一个浅表副本,因此并非在所有情况下都有效(特别是在存在更多嵌套的情况下),因此请查看深表副本以寻求更可靠的解决方案。