table.maxn (table)
Returns the largest positive numerical index of the given table, or zero if the table has no positive numerical indices. (To do its job this function does a linear traversal of the whole table.)
返回表中最大的正数值index。
说明:
1、 此接口不是统计表中元素的数目。
2、 如果表中 positive numerical index 不是连续的, 12 4, 缺少3为index的元素, 计算值为 maxn为 4。
local test = {1} table.insert(test, {}) table.insert(test, 4, {}) print("table.maxn(test)="..table.maxn(test)) for i,v in pairs(test) do print("i="..i.." v="..tostring(v)) end
LOG:
>lua -e "io.stdout:setvbuf 'no'" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 00559670
i=4 v=table: 005597B0
FOR IPAIRS vs Non Positive Integer Index
对于不连续的 positive integer index情况, 如果使用 ipairs 迭代器, 只能获取第一个连续的index段。
故不能遍历所有元素, 如果需要则使用 pairs迭代器。
local test = {1} table.insert(test, {}) table.insert(test, 4, {}) print("table.maxn(test)="..table.maxn(test)) for i,v in ipairs(test) do print("i="..i.." v="..tostring(v)) end
LOG:
>lua -e "io.stdout:setvbuf 'no'" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 00339580
table.remove (table [, pos])
Removes from
table
the element at positionpos
, shifting down other elements to close the space, if necessary. Returns the value of the removed element. The default value forpos
isn
, wheren
is the length of the table, so that a calltable.remove(t)
removes the last element of tablet
.
删除pos位置元素, 并将左边的高index元素向左移动一个位置。 此处所指的高index是指左侧所有的 元素, 故 maxn值会减少1.
local test = {1} table.insert(test, {}) table.insert(test, 4, {}) print("table.maxn(test)="..table.maxn(test)) for i,v in pairs(test) do print("i="..i.." v="..tostring(v)) end table.remove(test, 1) print("table.maxn(test)="..table.maxn(test)) for i,v in pairs(test) do print("i="..i.." v="..tostring(v)) end
LOG:
>lua -e "io.stdout:setvbuf 'no'" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 00589350
i=4 v=table: 005892B0
table.maxn(test)=3
i=1 v=table: 00589350
i=3 v=table: 005892B0
>Exit code: 0
table.insert (table, [pos,] value)
Inserts element
value
at positionpos
intable
, shifting up other elements to open space, if necessary. The default value forpos
isn+1
, wheren
is the length of the table (see §2.5.5), so that a calltable.insert(t,x)
insertsx
at the end of tablet
.
将元素value插到pos位置, 此位置以及以上的元素都向右边移动一位。 会将maxn值加1.
local test = {1} table.insert(test, {}) table.insert(test, 4, {}) print("table.maxn(test)="..table.maxn(test)) for i,v in pairs(test) do print("i="..i.." v="..tostring(v)) end table.insert(test, 1, 33) print("table.maxn(test)="..table.maxn(test)) for i,v in pairs(test) do print("i="..i.." v="..tostring(v)) end
LOG:
>lua -e "io.stdout:setvbuf 'no'" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 00979800
i=4 v=table: 009795F8
table.maxn(test)=5
i=1 v=33
i=2 v=1
i=3 v=table: 00979800
i=5 v=table: 009795F8
>Exit code: 0
table.remove vs nil set
nil 不会做 将右边的元素向左移动一位的动作, remove会。
local test = {1} table.insert(test, {}) table.insert(test, 4, {}) print("table.maxn(test)="..table.maxn(test)) for i,v in pairs(test) do print("i="..i.." v="..tostring(v)) end test[1] = nil print("table.maxn(test)="..table.maxn(test)) for i,v in pairs(test) do print("i="..i.." v="..tostring(v)) end
LOG:
>lua -e "io.stdout:setvbuf 'no'" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 003D9508
i=4 v=table: 003D9580
table.maxn(test)=4
i=2 v=table: 003D9508
i=4 v=table: 003D9580
>Exit code: 0