lua table integer index 特性

本文详细介绍了Lua语言中表的操作方法,包括table.maxn、table.insert和table.remove等函数的使用方式及注意事项。通过实例演示了如何获取表的最大索引、插入和移除元素及其对表的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 position pos, shifting down other elements to close the space, if necessary. Returns the value of the removed element. The default value for pos is n, where n is the length of the table, so that a call table.remove(t) removes the last element of table t.

 

删除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 position pos in table, shifting up other elements to open space, if necessary. The default value for pos is n+1, where n is the length of the table (see §2.5.5), so that a call table.insert(t,x) inserts x at the end of table t.

将元素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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值