Lua table的remove和nil操作的区别

我在看《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])

打印出的结果:
Lua table的remove和nil操作的区别_第1张图片

从结果可以看到,只是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的结果
Lua table的remove和nil操作的区别_第2张图片

从结果可以看出table.remove真正删除了第4个元素,后面的元素向前挪了一个位置,也就是说,table.remove删除元素影响到了后面的元素位置。

注意:这里的table类似与数组的概念,类似字典的使用nil删除即可。

你可能感兴趣的:(Lua)