我在看《Lua程序设计(第二版)》的时候,这本书不是看了不止一遍了,每次看都有新发现。
今天看到这么一句话:Lua中的table可以像全局变量一样,将nil赋予table的某个元素来删除该元素。了解Lua的都知道Lua的table还有个table.remove方法来删除table中的制定元素,对于这两种删除table元素的方法,我每次总搞混删除后table究竟变成了什么样子,为了以后再忘记,今天就自己敲了几行代码,以后方便查看。
首先看一下使用赋值nil的方式删除table元素的结果
a = {1, 2, 3, 4, 5}
print("删除元素前的a: ")
for k, v in ipairs(a) do
print(k, v)
end
print("删除元素前a的长度 : ", #a)
a[4] = nil
print("删除元素后的a : ")
for k, v in ipairs(a) do
print(k, v)
end
print("删除元素后a的长度 : ", #a)
print("a[4] = ", a[4], "a[5] = ", a[5])
打印出的结果:
从结果可以看到,只是table的第四个元素变成了nil,其长度仍然是5,在使用ipairs打印a的元素的时候碰到nil结束循环,影响的仅仅是第四个元素,其他位置的元素均保持不变。
再来看一下table.remove方法
a = {1, 2, 3, 4, 5}
print("删除元素前的a: ")
for k, v in ipairs(a) do
print(k, v)
end
print("删除元素前a的长度 : ", #a)
table.remove(a, 4)
print("删除元素后的a : ")
for k, v in ipairs(a) do
print(k, v)
end
print("删除元素后a的长度 : ", #a)
print("a[4] = ", a[4], "a[5] = ", a[5])
table.remove的结果
从结果可以看出table.remove真正删除了第4个元素,后面的元素向前挪了一个位置,也就是说,table.remove删除元素影响到了后面的元素位置。
注意:这里的table类似与数组的概念,类似字典的使用nil删除即可。