给列表删除第二元素
aaa = {10,20,"30",nil,nil}
aaa[2] = nil
print(#aaa)
print(table.unpack(aaa))
输出:
1
10
给字符串 "30" 搞没了
为啥不是
3
10, nil,"30"
后面两个 nil 删除就没事:
aaa = {10,20,"30"}
aaa[2] = nil
print(#aaa)
print(table.unpack(aaa))
3
10 nil 30
求教
1
mywaiting 2022-02-07 17:26:06 +08:00 1
关键字 nil as an element in a Lua table 搜索看看~
|
2
rrfeng 2022-02-07 17:36:07 +08:00 1
因为 table 作为 array (只有 value 没有 key )的时候,遍历遇到 nil 就会终止。
|
3
pkwenda OP |
5
muzuiget 2022-02-07 19:11:54 +08:00 1
table 在本质就是一个字典结构,只不过可以使用数字类型做 key 而已,当 key 是数字类型时,Lua 在内部会做一些骚操作优化。
只要你将存值和取值分开看好理解了,例如 aaa = {} aaa[1000] = 1234 并不会把 aaa 变成一个 1000 个长度的“数组”(别的语言可能叫“稀疏数组”)。 所以当你 aaa[2] = nil 时,这就不是一般意义上的数组了,Lua 在 C 结构上可能被优化掉了,# 操作符结果就是未定义了(顶多在告诉你在 C 层面用了多少内存)。 这表示你用 aaa = {10,20,"30"} 还是 aaa = {10,20,"30",nil,nil} 在 Lua 层面上是一样的,但是在 C 层面上,第二种写法,可以提示 Lua 这个 table 可以提前分配多少内存。 |
6
nightwitch 2022-02-07 22:57:33 +08:00 1
虽然同样是 table 这个数据结构,但是写的时候大脑里要严格区分序列,数组和哈希表三个概念。
PIL 4th 第四版的 5.3 节里量良定义了序列: 所有元素都不为 nil 的数组。 #作为取*序列*长度操作符,对于含 nil 元素的元表使用结果是未定义的 |